pax_global_header00006660000000000000000000000064146455130340014517gustar00rootroot0000000000000052 comment=5d87bfb322da283e514adce01512324c7f63d9e5 pyenphase-pyenphase-1bfa6dd/000077500000000000000000000000001464551303400162565ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/.all-contributorsrc000066400000000000000000000004401464551303400221050ustar00rootroot00000000000000{ "projectName": "pyenphase", "projectOwner": "pyenphase", "repoType": "github", "repoHost": "https://github.com", "files": ["README.md"], "imageSize": 80, "commit": true, "commitConvention": "angular", "contributors": [], "contributorsPerLine": 7, "skipCi": true } pyenphase-pyenphase-1bfa6dd/.copier-answers.yml000066400000000000000000000007651464551303400220300ustar00rootroot00000000000000# Changes here will be overwritten by Copier _commit: 038bdbe _src_path: gh:browniebroke/pypackage-template add_me_as_contributor: false copyright_year: '2023' documentation: true email: cgarwood@gmail.com full_name: pyenphase github_username: pyenphase initial_commit: true open_source_license: MIT package_name: pyenphase project_name: pyenphase project_short_description: Library to control enphase envoy project_slug: pyenphase run_poetry_install: true setup_github: false setup_pre_commit: true pyenphase-pyenphase-1bfa6dd/.editorconfig000066400000000000000000000004441464551303400207350ustar00rootroot00000000000000# http://editorconfig.org root = true [*] indent_style = space indent_size = 4 trim_trailing_whitespace = true insert_final_newline = true charset = utf-8 end_of_line = lf [*.bat] indent_style = tab end_of_line = crlf [LICENSE] insert_final_newline = false [Makefile] indent_style = tab pyenphase-pyenphase-1bfa6dd/.flake8000066400000000000000000000000561464551303400174320ustar00rootroot00000000000000[flake8] exclude = docs max-line-length = 188 pyenphase-pyenphase-1bfa6dd/.github/000077500000000000000000000000001464551303400176165ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/.github/FUNDING.yml000066400000000000000000000000261464551303400214310ustar00rootroot00000000000000github: ["pyenphase"] pyenphase-pyenphase-1bfa6dd/.github/ISSUE_TEMPLATE/000077500000000000000000000000001464551303400220015ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/.github/ISSUE_TEMPLATE/1-bug_report.md000066400000000000000000000004221464551303400246270ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve labels: bug --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: **Additional context** Add any other context about the problem here. pyenphase-pyenphase-1bfa6dd/.github/ISSUE_TEMPLATE/2-feature-request.md000066400000000000000000000006721464551303400256100ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project labels: enhancement --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Additional context** Add any other context or screenshots about the feature request here. pyenphase-pyenphase-1bfa6dd/.github/labels.toml000066400000000000000000000035151464551303400217610ustar00rootroot00000000000000[breaking] color = "ffcc00" name = "breaking" description = "Breaking change." [bug] color = "d73a4a" name = "bug" description = "Something isn't working" [dependencies] color = "0366d6" name = "dependencies" description = "Pull requests that update a dependency file" [github_actions] color = "000000" name = "github_actions" description = "Update of github actions" [documentation] color = "1bc4a5" name = "documentation" description = "Improvements or additions to documentation" [duplicate] color = "cfd3d7" name = "duplicate" description = "This issue or pull request already exists" [enhancement] color = "a2eeef" name = "enhancement" description = "New feature or request" ["good first issue"] color = "7057ff" name = "good first issue" description = "Good for newcomers" ["help wanted"] color = "008672" name = "help wanted" description = "Extra attention is needed" [invalid] color = "e4e669" name = "invalid" description = "This doesn't seem right" [nochangelog] color = "555555" name = "nochangelog" description = "Exclude pull requests from changelog" [question] color = "d876e3" name = "question" description = "Further information is requested" [removed] color = "e99695" name = "removed" description = "Removed piece of functionalities." [tests] color = "bfd4f2" name = "tests" description = "CI, CD and testing related changes" [wontfix] color = "ffffff" name = "wontfix" description = "This will not be worked on" [discussion] color = "c2e0c6" name = "discussion" description = "Some discussion around the project" [hacktoberfest] color = "ffa663" name = "hacktoberfest" description = "Good issues for Hacktoberfest" [answered] color = "0ee2b6" name = "answered" description = "Automatically closes as answered after a delay" [waiting] color = "5f7972" name = "waiting" description = "Automatically closes if no answer after a delay" pyenphase-pyenphase-1bfa6dd/.github/workflows/000077500000000000000000000000001464551303400216535ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/.github/workflows/ci.yml000066400000000000000000000033151464551303400227730ustar00rootroot00000000000000name: CI on: push: branches: - main pull_request: concurrency: group: ${{ github.head_ref || github.run_id }} cancel-in-progress: true permissions: write-all jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: "3.11" - uses: pre-commit/action@v3.0.0 test: strategy: fail-fast: false matrix: python-version: - "3.11" - "3.12" os: - ubuntu-latest runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - uses: snok/install-poetry@v1.3.3 - name: Install Dependencies run: poetry install shell: bash - name: Test with Pytest run: poetry run pytest --cov-report=xml shell: bash - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} release: runs-on: ubuntu-latest environment: release needs: - test - lint steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - name: Release uses: python-semantic-release/python-semantic-release@v7.34.6 if: github.ref_name == 'main' with: github_token: ${{ secrets.GITHUB_TOKEN }} pypi_token: ${{ secrets.PYPI_TOKEN }} - name: Test release uses: python-semantic-release/python-semantic-release@v7.34.6 if: github.ref_name != 'main' with: additional_options: --noop pyenphase-pyenphase-1bfa6dd/.github/workflows/hacktoberfest.yml000066400000000000000000000005341464551303400252240ustar00rootroot00000000000000name: Hacktoberfest on: schedule: # Run every day in October - cron: "0 0 * 10 *" # Run on the 1st of November to revert - cron: "0 13 1 11 *" jobs: hacktoberfest: runs-on: ubuntu-latest steps: - uses: browniebroke/hacktoberfest-labeler-action@v2.3.0 with: github_token: ${{ secrets.GH_PAT }} pyenphase-pyenphase-1bfa6dd/.github/workflows/issue-manager.yml000066400000000000000000000013401464551303400251340ustar00rootroot00000000000000name: Issue Manager on: schedule: - cron: "0 0 * * *" issue_comment: types: - created issues: types: - labeled pull_request_target: types: - labeled workflow_dispatch: jobs: issue-manager: runs-on: ubuntu-latest steps: - uses: tiangolo/issue-manager@0.4.0 with: token: ${{ secrets.GITHUB_TOKEN }} config: > { "answered": { "message": "Assuming the original issue was solved, it will be automatically closed now." }, "waiting": { "message": "Automatically closing. To re-open, please provide the additional information requested." } } pyenphase-pyenphase-1bfa6dd/.github/workflows/poetry-upgrade.yml000066400000000000000000000003401464551303400253420ustar00rootroot00000000000000name: Upgrader on: workflow_dispatch: schedule: - cron: "19 14 6 * *" jobs: upgrade: uses: browniebroke/github-actions/.github/workflows/poetry-upgrade.yml@v1 secrets: gh_pat: ${{ secrets.GH_PAT }} pyenphase-pyenphase-1bfa6dd/.github/workflows/pr-title.yml000066400000000000000000000005601464551303400241370ustar00rootroot00000000000000name: PR Title on: pull_request: pull_request_target: jobs: # Make sure pre title follow the conventional commits convention: # https://www.conventionalcommits.org commitlint: name: Lint PR Title runs-on: ubuntu-latest steps: - uses: amannn/action-semantic-pull-request@v5 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} pyenphase-pyenphase-1bfa6dd/.gitignore000066400000000000000000000153501464551303400202520ustar00rootroot00000000000000# Created by https://www.toptal.com/developers/gitignore/api/python,visualstudiocode,pycharm+all,linux,macos,windows # Edit at https://www.toptal.com/developers/gitignore?templates=python,visualstudiocode,pycharm+all,linux,macos,windows ### Linux ### *~ # temporary files which can be created if a process still has a handle open of a deleted file .fuse_hidden* # KDE directory preferences .directory # Linux trash folder which might appear on any partition or disk .Trash-* # .nfs files are created when an open file is removed but is still being accessed .nfs* ### macOS ### # General .DS_Store .AppleDouble .LSOverride # Icon must end with two \r Icon # Thumbnails ._* # Files that might appear in the root of a volume .DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent # Directories potentially created on remote AFP share .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk ### macOS Patch ### # iCloud generated files *.icloud ### PyCharm+all ### # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff .idea/**/workspace.xml .idea/**/tasks.xml .idea/**/usage.statistics.xml .idea/**/dictionaries .idea/**/shelf # AWS User-specific .idea/**/aws.xml # Generated files .idea/**/contentModel.xml # Sensitive or high-churn files .idea/**/dataSources/ .idea/**/dataSources.ids .idea/**/dataSources.local.xml .idea/**/sqlDataSources.xml .idea/**/dynamic.xml .idea/**/uiDesigner.xml .idea/**/dbnavigator.xml # Gradle .idea/**/gradle.xml .idea/**/libraries # Gradle and Maven with auto-import # When using Gradle or Maven with auto-import, you should exclude module files, # since they will be recreated, and may cause churn. Uncomment if using # auto-import. # .idea/artifacts # .idea/compiler.xml # .idea/jarRepositories.xml # .idea/modules.xml # .idea/*.iml # .idea/modules # *.iml # *.ipr # CMake cmake-build-*/ # Mongo Explorer plugin .idea/**/mongoSettings.xml # File-based project format *.iws # IntelliJ out/ # mpeltonen/sbt-idea plugin .idea_modules/ # JIRA plugin atlassian-ide-plugin.xml # Cursive Clojure plugin .idea/replstate.xml # SonarLint plugin .idea/sonarlint/ # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties # Editor-based Rest Client .idea/httpRequests # Android studio 3.1+ serialized cache file .idea/caches/build_file_checksums.ser ### PyCharm+all Patch ### # Ignore everything but code style settings and run configurations # that are supposed to be shared within teams. .idea/* !.idea/codeStyles !.idea/runConfigurations ### Python ### # 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/ 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/ cover/ # 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 .pybuilder/ target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv # For a library or package, you might want to ignore these files since the code is # intended to run in multiple environments; otherwise, check them in: # .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 # poetry # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. # This is especially recommended for binary packages to ensure reproducibility, and is more # commonly ignored for libraries. # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control #poetry.lock # pdm # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. #pdm.lock # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it # in version control. # https://pdm.fming.dev/#use-with-ide .pdm.toml # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm __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/ # pytype static type analyzer .pytype/ # Cython debug symbols cython_debug/ # PyCharm # JetBrains specific template is maintained in a separate JetBrains.gitignore that can # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ ### Python Patch ### # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration poetry.toml # ruff .ruff_cache/ # LSP config files pyrightconfig.json ### VisualStudioCode ### .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json !.vscode/*.code-snippets # Local History for Visual Studio Code .history/ # Built Visual Studio Code Extensions *.vsix ### VisualStudioCode Patch ### # Ignore all local history of files .history .ionide ### Windows ### # Windows thumbnail cache files Thumbs.db Thumbs.db:encryptable ehthumbs.db ehthumbs_vista.db # Dump file *.stackdump # Folder config file [Dd]esktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ # Windows Installer files *.cab *.msi *.msix *.msm *.msp # Windows shortcuts *.lnk # End of https://www.toptal.com/developers/gitignore/api/python,visualstudiocode,pycharm+all,linux,macos,windows pyenphase-pyenphase-1bfa6dd/.gitpod.yml000066400000000000000000000003061464551303400203440ustar00rootroot00000000000000tasks: - command: | pip install poetry PIP_USER=false poetry install - command: | pip install pre-commit pre-commit install PIP_USER=false pre-commit install-hooks pyenphase-pyenphase-1bfa6dd/.pre-commit-config.yaml000066400000000000000000000034121464551303400225370ustar00rootroot00000000000000# See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks exclude: "CHANGELOG.md|.copier-answers.yml" default_stages: [commit] ci: autofix_commit_msg: "chore(pre-commit.ci): auto fixes" autoupdate_commit_msg: "chore(pre-commit.ci): pre-commit autoupdate" repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.6.0 hooks: - id: debug-statements - id: check-builtin-literals - id: check-case-conflict - id: check-docstring-first - id: check-json exclude: | (?x)^( tests/fixtures/.*/.*\.json )$ - id: check-toml - id: check-xml - id: check-yaml - id: detect-private-key - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/python-poetry/poetry rev: 1.8.0 hooks: - id: poetry-check - repo: https://github.com/pre-commit/mirrors-prettier rev: v4.0.0-alpha.8 hooks: - id: prettier args: ["--tab-width", "2"] - repo: https://github.com/asottile/pyupgrade rev: v3.16.0 hooks: - id: pyupgrade args: [--py37-plus] - repo: https://github.com/PyCQA/isort rev: 5.13.2 hooks: - id: isort - repo: https://github.com/psf/black rev: 24.4.2 hooks: - id: black - repo: https://github.com/codespell-project/codespell rev: v2.3.0 hooks: - id: codespell - repo: https://github.com/PyCQA/flake8 rev: 7.1.0 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.10.1 hooks: - id: mypy additional_dependencies: ["types-orjson"] - repo: https://github.com/PyCQA/bandit rev: 1.7.9 hooks: - id: bandit args: [-x, tests] pyenphase-pyenphase-1bfa6dd/.prettierignore000066400000000000000000000000311464551303400213130ustar00rootroot00000000000000tests/fixtures/**/*.json pyenphase-pyenphase-1bfa6dd/.readthedocs.yml000066400000000000000000000012471464551303400213500ustar00rootroot00000000000000# Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the version of Python and other tools you might need build: os: ubuntu-20.04 tools: python: "3.11" jobs: post_create_environment: # Install poetry - pip install poetry post_install: # Install dependencies # VIRTUAL_ENV needs to be set manually for now. # See https://github.com/readthedocs/readthedocs.org/pull/11152/ - VIRTUAL_ENV=$READTHEDOCS_VIRTUALENV_PATH poetry install --with docs # Build documentation in the docs directory with Sphinx sphinx: configuration: docs/conf.py pyenphase-pyenphase-1bfa6dd/.rtx.toml000066400000000000000000000000701464551303400200430ustar00rootroot00000000000000[tools] python = { version="3.11", virtualenv=".venv" } pyenphase-pyenphase-1bfa6dd/CHANGELOG.md000066400000000000000000000511271464551303400200750ustar00rootroot00000000000000# Changelog ## v1.21.0 (2024-07-16) ### Feature * **generator:** Probe for generator ([#160](https://github.com/pyenphase/pyenphase/issues/160)) ([`42a2533`](https://github.com/pyenphase/pyenphase/commit/42a2533f44ec975c72bd0be9dc70c75a987ff030)) ## v1.20.6 (2024-07-03) ### Fix * raise EnvoyCommunicationError for httpx ConnectError and TimeoutException exceptions during Envoy.update ([#170](https://github.com/pyenphase/pyenphase/issues/170)) ([`c6d238f`](https://github.com/pyenphase/pyenphase/commit/c6d238f83b10622cb20493bcf70e4e54deb751d2)) ## v1.20.5 (2024-07-03) ### Fix * Report EnvoyHTTPStatusError for _json_request if status not in 200-300 ([#171](https://github.com/pyenphase/pyenphase/issues/171)) ([`46fb2b3`](https://github.com/pyenphase/pyenphase/commit/46fb2b386ff1991ba26d4b60628163cff147afa9)) ## v1.20.4 (2024-07-02) ### Fix * For fw 3.x mark production with only zero values as EnvoyPoorDataQuality error ([#173](https://github.com/pyenphase/pyenphase/issues/173)) ([`8b6b302`](https://github.com/pyenphase/pyenphase/commit/8b6b302b626742e101708c5bbd0c0a46e86f9cb7)) ## v1.20.3 (2024-05-07) ### Fix * Get production phase data using details parameter ([#159](https://github.com/pyenphase/pyenphase/issues/159)) ([`d2a478c`](https://github.com/pyenphase/pyenphase/commit/d2a478c25581cbb147506d138db3043c70345fae)) ## v1.20.2 (2024-04-18) ### Fix * Add missing EnvoyTokenAuth class properties ([#150](https://github.com/pyenphase/pyenphase/issues/150)) ([`d01157a`](https://github.com/pyenphase/pyenphase/commit/d01157a1ec3139f67e085f0a4e529f2e7af09943)) ### Documentation * Use new format to specify virtual env for readthedocs ([#152](https://github.com/pyenphase/pyenphase/issues/152)) ([`4b9a9ea`](https://github.com/pyenphase/pyenphase/commit/4b9a9ea79ef94dfd1fed2b262a12cb016da2802c)) * Let readthedocs use virtualenv for build ([#151](https://github.com/pyenphase/pyenphase/issues/151)) ([`9e8b648`](https://github.com/pyenphase/pyenphase/commit/9e8b648875db5fcc2210d7f180c0d278485eafb8)) ## v1.20.1 (2024-03-26) ### Fix * Endless loop on envoy unreachable ([#145](https://github.com/pyenphase/pyenphase/issues/145)) ([`f074c61`](https://github.com/pyenphase/pyenphase/commit/f074c61b56b0fdb1080ff3c54f82c59a8015b6d9)) ## v1.20.0 (2024-03-21) ### Feature * Report storage CT data ([#144](https://github.com/pyenphase/pyenphase/issues/144)) ([`52c53fe`](https://github.com/pyenphase/pyenphase/commit/52c53fe20123514177290e964e03a23454e42e9c)) ## v1.19.2 (2024-03-08) ### Fix * Consumption CT not found when 3 CT reported ([#140](https://github.com/pyenphase/pyenphase/issues/140)) ([`7c2f52c`](https://github.com/pyenphase/pyenphase/commit/7c2f52cc28fdc872a8c5875fc7f7d8b7e233bc01)) ## v1.19.1 (2024-02-27) ### Fix * Force release ([#139](https://github.com/pyenphase/pyenphase/issues/139)) ([`b16f132`](https://github.com/pyenphase/pyenphase/commit/b16f13264ffdb90de53d3d9730eb0cd700724ffd)) ## v1.19.0 (2024-01-27) ### Feature * Add envoy_model property ([#136](https://github.com/pyenphase/pyenphase/issues/136)) ([`42652cd`](https://github.com/pyenphase/pyenphase/commit/42652cda168d1cf1d4b637071f0603d0b0707066)) ## v1.18.0 (2024-01-23) ### Feature * Add updater for Current Transformer data ([#135](https://github.com/pyenphase/pyenphase/issues/135)) ([`1ca6118`](https://github.com/pyenphase/pyenphase/commit/1ca6118e6aaecb829b4cd711d72d6296fad26bae)) ### Documentation * Document CT meter data ([#134](https://github.com/pyenphase/pyenphase/issues/134)) ([`cfd396b`](https://github.com/pyenphase/pyenphase/commit/cfd396bde18a908d7703d421a10126abc06f0542)) ## v1.17.0 (2024-01-11) ### Feature * Write request reply to debuglog when in debug ([#131](https://github.com/pyenphase/pyenphase/issues/131)) ([`e255684`](https://github.com/pyenphase/pyenphase/commit/e25568444ca4a629bc38904c0f27777550219117)) ### Documentation * Reorganize and extend documentation. ([#129](https://github.com/pyenphase/pyenphase/issues/129)) ([`4d8e463`](https://github.com/pyenphase/pyenphase/commit/4d8e463fc5d5e500876f721ae2831cc90a275d9a)) ## v1.16.0 (2024-01-09) ### Feature * Provide phase data for envoy metered with ct ([#126](https://github.com/pyenphase/pyenphase/issues/126)) ([`454dbc5`](https://github.com/pyenphase/pyenphase/commit/454dbc58ebb2edf23e9c64173fb8b5d155b327fc)) ## v1.15.2 (2023-12-20) ### Fix * 3.9.x firmware with meters probe ([#128](https://github.com/pyenphase/pyenphase/issues/128)) ([`06606c5`](https://github.com/pyenphase/pyenphase/commit/06606c5516c84b3ee500843b8b843bf180658055)) ## v1.15.1 (2023-12-20) ### Fix * Skip meters endpoint if it returns a 401 ([#125](https://github.com/pyenphase/pyenphase/issues/125)) ([`166c25c`](https://github.com/pyenphase/pyenphase/commit/166c25c410b6fa319bddea78db44606da7364aeb)) ## v1.15.0 (2023-12-19) ### Feature * Provide phase configuration for envoy metered with ct ([#122](https://github.com/pyenphase/pyenphase/issues/122)) ([`12204a8`](https://github.com/pyenphase/pyenphase/commit/12204a8ec2082cb561f334e21e6febfdb2c8a082)) ## v1.14.3 (2023-11-11) ### Fix * **#99:** Envoy metered without CT reporting wrong values ([#111](https://github.com/pyenphase/pyenphase/issues/111)) ([`2188969`](https://github.com/pyenphase/pyenphase/commit/21889696fdc06f423f382eb404483e1b5d641094)) ### Documentation * Update usage.md ([#109](https://github.com/pyenphase/pyenphase/issues/109)) ([`2e31671`](https://github.com/pyenphase/pyenphase/commit/2e316718081fccab314844a76aa9c6e4e54d20a9)) ## v1.14.2 (2023-11-06) ### Fix * Make date field optional in storage settings tariff model ([#112](https://github.com/pyenphase/pyenphase/issues/112)) ([`cf98198`](https://github.com/pyenphase/pyenphase/commit/cf98198b80326f5bf57c58c77eedbe17b6142b0b)) ## v1.14.1 (2023-11-02) ### Fix * Add economy EnvoyStorageMode ([#110](https://github.com/pyenphase/pyenphase/issues/110)) ([`edaf93c`](https://github.com/pyenphase/pyenphase/commit/edaf93c8c1cd71f34bf0be227436f676b1c13772)) ## v1.14.0 (2023-10-24) ### Feature * **multiphase:** Add phase_count property to envoy ([#105](https://github.com/pyenphase/pyenphase/issues/105)) ([`39ec460`](https://github.com/pyenphase/pyenphase/commit/39ec4606b1bfc152189c48edc89396267564ac13)) ## v1.13.1 (2023-10-21) ### Fix * Ensure tariff endpoint is skipped on firmware 3 ([#102](https://github.com/pyenphase/pyenphase/issues/102)) ([`4fd7796`](https://github.com/pyenphase/pyenphase/commit/4fd77967230089ec9e86c6e6c3e237b6153abb87)) ## v1.13.0 (2023-10-20) ### Feature * Add support for changing storage mode and reserve soc ([#101](https://github.com/pyenphase/pyenphase/issues/101)) ([`16a1471`](https://github.com/pyenphase/pyenphase/commit/16a1471d7b2e961be218825151401a4cd27fe096)) ## v1.12.0 (2023-10-11) ### Feature * Add initial tariff support and charge from grid functions ([#95](https://github.com/pyenphase/pyenphase/issues/95)) ([`5418d4c`](https://github.com/pyenphase/pyenphase/commit/5418d4c99ee6a5f0998367525ccba65f0edb9bc5)) ## v1.11.4 (2023-09-13) ### Fix * Use eim if activeCount is true ([#91](https://github.com/pyenphase/pyenphase/issues/91)) ([`ac041a4`](https://github.com/pyenphase/pyenphase/commit/ac041a4abd2119fa3c784aa74634b27e118b7624)) ## v1.11.3 (2023-09-13) ### Fix * More dry contact settings should be optional ([#90](https://github.com/pyenphase/pyenphase/issues/90)) ([`4fc503a`](https://github.com/pyenphase/pyenphase/commit/4fc503a4f8f60051319aaabf386bced2cd0f3076)) ## v1.11.2 (2023-09-12) ### Fix * Disable consumption when there are no active meters ([#87](https://github.com/pyenphase/pyenphase/issues/87)) ([`fa28f1c`](https://github.com/pyenphase/pyenphase/commit/fa28f1c31344f0e2d1bc60640902e94bd55b0331)) ## v1.11.1 (2023-09-12) ### Fix * Black_s_start key not returned by all Ensemble systems ([#84](https://github.com/pyenphase/pyenphase/issues/84)) ([`357f0bd`](https://github.com/pyenphase/pyenphase/commit/357f0bd132a976f31a052063ce514ac86534de8e)) ## v1.11.0 (2023-09-08) ### Feature * Add fallback when api/v1/production endpoint is broken ([#83](https://github.com/pyenphase/pyenphase/issues/83)) ([`d7e195e`](https://github.com/pyenphase/pyenphase/commit/d7e195e498362d1374366d88a24afc8da6b01321)) ## v1.10.0 (2023-09-08) ### Feature * Add 7.6.175 fixtures with total consumption ([#81](https://github.com/pyenphase/pyenphase/issues/81)) ([`1bc2b20`](https://github.com/pyenphase/pyenphase/commit/1bc2b20a427c6d03df318fcf5c529391fc6e25ed)) ## v1.9.3 (2023-09-07) ### Fix * Handle /production returning a 401 even with the correct auth on some 3.x firmwares ([#80](https://github.com/pyenphase/pyenphase/issues/80)) ([`947605f`](https://github.com/pyenphase/pyenphase/commit/947605fba25b41d12db273e9352c29b08cac1d4d)) ## v1.9.2 (2023-09-07) ### Fix * Raise EnvoyAuthenticationRequired when local auth is incorrect ([#79](https://github.com/pyenphase/pyenphase/issues/79)) ([`208e91a`](https://github.com/pyenphase/pyenphase/commit/208e91a6a66e8afa0931bb3a78e557b882277148)) ## v1.9.1 (2023-09-04) ### Fix * Envoy default password is last 6 not first 6 ([#78](https://github.com/pyenphase/pyenphase/issues/78)) ([`33d07f6`](https://github.com/pyenphase/pyenphase/commit/33d07f6fb231a274bfdf5e693d1d2200fc0b516d)) ## v1.9.0 (2023-09-03) ### Feature * Add ivp/meters and ivp/meters/readings to fixture collector ([#77](https://github.com/pyenphase/pyenphase/issues/77)) ([`74c02bc`](https://github.com/pyenphase/pyenphase/commit/74c02bc882435f8605c85600c7f598a7e77c7141)) ## v1.8.1 (2023-08-23) ### Fix * Preemptively update dry contact state when toggling ([#75](https://github.com/pyenphase/pyenphase/issues/75)) ([`6a3f12f`](https://github.com/pyenphase/pyenphase/commit/6a3f12f26355721a4d12f3ef490659e4c4ce4a4c)) ## v1.8.0 (2023-08-19) ### Feature * Add initial support for firmware 8.1.41 ([#73](https://github.com/pyenphase/pyenphase/issues/73)) ([`3562261`](https://github.com/pyenphase/pyenphase/commit/3562261d51a2f3d539d125c3512d9b1ca9b9bd6d)) ## v1.7.1 (2023-08-15) ### Fix * Startup was blocked for multiple minutes if the envoy was offline ([#71](https://github.com/pyenphase/pyenphase/issues/71)) ([`983ef52`](https://github.com/pyenphase/pyenphase/commit/983ef52e92ffff5a91b8de8bddda68f460058b56)) ## v1.7.0 (2023-08-15) ### Feature * Add support for opening and closing dry contact relays ([#70](https://github.com/pyenphase/pyenphase/issues/70)) ([`f59aa54`](https://github.com/pyenphase/pyenphase/commit/f59aa546e4991c5aee446e9629b48df2ca556272)) ## v1.6.0 (2023-08-13) ### Feature * Add support for changing settings on dry contact relays ([#68](https://github.com/pyenphase/pyenphase/issues/68)) ([`345165a`](https://github.com/pyenphase/pyenphase/commit/345165a92ffc7ffc35c5d09626757c53f4add7d2)) ## v1.5.3 (2023-08-12) ### Fix * Add "schedule" to DryContactAction ([#67](https://github.com/pyenphase/pyenphase/issues/67)) ([`403d8dc`](https://github.com/pyenphase/pyenphase/commit/403d8dc5c0361a30b95e57fdeda13ea25fd8179a)) ## v1.5.2 (2023-08-11) ### Fix * Add EnvoyEnchargeAggregate to __all__ ([#66](https://github.com/pyenphase/pyenphase/issues/66)) ([`63b7698`](https://github.com/pyenphase/pyenphase/commit/63b76980d620cf7e125df0d6058c80230f66756a)) ## v1.5.1 (2023-08-11) ### Fix * Switch fetching aggregate Encharge data to simpler endpoint ([#65](https://github.com/pyenphase/pyenphase/issues/65)) ([`e076476`](https://github.com/pyenphase/pyenphase/commit/e07647656920779e7a18a045ddfea1dec583fba7)) ## v1.5.0 (2023-08-11) ### Feature * Add EnchargeAggregate model for aggregated battery data ([#64](https://github.com/pyenphase/pyenphase/issues/64)) ([`6985935`](https://github.com/pyenphase/pyenphase/commit/69859358ad6c4146fac30198ec5a342633db9834)) ## v1.4.0 (2023-08-10) ### Feature * Add support for toggling grid on/off ([#62](https://github.com/pyenphase/pyenphase/issues/62)) ([`63d44dd`](https://github.com/pyenphase/pyenphase/commit/63d44ddbc59d04ca6afb6b3526a37cda32c7417d)) ## v1.3.0 (2023-08-09) ### Feature * Refactor register interface to allow unregistering an updater ([#60](https://github.com/pyenphase/pyenphase/issues/60)) ([`82efcec`](https://github.com/pyenphase/pyenphase/commit/82efcec228dbe263c3f1c39e6ded3e9283fbfac2)) ## v1.2.2 (2023-08-09) ### Fix * Remove unreachable code in inverters updater ([#61](https://github.com/pyenphase/pyenphase/issues/61)) ([`84b6be0`](https://github.com/pyenphase/pyenphase/commit/84b6be081cde7bf624baaae2b5df5c1177144dec)) ## v1.2.1 (2023-08-09) ### Fix * Incorrect typing on enpower mains_*_state attributes ([#59](https://github.com/pyenphase/pyenphase/issues/59)) ([`14c7c14`](https://github.com/pyenphase/pyenphase/commit/14c7c14124ca33df6e011b1fa32ed4c57da7e294)) ## v1.2.0 (2023-08-09) ### Feature * Refactor to break updaters into modules ([#54](https://github.com/pyenphase/pyenphase/issues/54)) ([`a4686a3`](https://github.com/pyenphase/pyenphase/commit/a4686a30be37f88a3af27257b4a8d017d1579122)) ## v1.1.4 (2023-08-08) ### Fix * Return DryContactStatus enum for status ([#53](https://github.com/pyenphase/pyenphase/issues/53)) ([`d366ff3`](https://github.com/pyenphase/pyenphase/commit/d366ff3c86a3419bb0ffcbd24a1edb0333b0a32f)) ## v1.1.3 (2023-08-08) ### Fix * Handle envoy sending bad json ([#52](https://github.com/pyenphase/pyenphase/issues/52)) ([`7109e66`](https://github.com/pyenphase/pyenphase/commit/7109e6604f5fc1d1b197a128ceb264c9e00410d4)) ## v1.1.2 (2023-08-08) ### Fix * Adjust timeouts for when envoy is having trouble with DNS ([#51](https://github.com/pyenphase/pyenphase/issues/51)) ([`c82f9bb`](https://github.com/pyenphase/pyenphase/commit/c82f9bbf69f884516985dde04207d375c4953ad3)) ## v1.1.1 (2023-08-08) ### Fix * Add Enpower and DryContact classes to __all__ ([#50](https://github.com/pyenphase/pyenphase/issues/50)) ([`d37b5e9`](https://github.com/pyenphase/pyenphase/commit/d37b5e9b6e6f12d62ba57a2f6d745868adf67914)) ## v1.1.0 (2023-08-08) ### Feature * Add support for pulling dry contact data ([#48](https://github.com/pyenphase/pyenphase/issues/48)) ([`7814650`](https://github.com/pyenphase/pyenphase/commit/78146506bb4a93b51987a2b8725cc32f35368643)) ## v1.0.0 (2023-08-08) ### Breaking * drop python3.10 support ([#49](https://github.com/pyenphase/pyenphase/issues/49)) ([`9d8c20d`](https://github.com/pyenphase/pyenphase/commit/9d8c20d8f1d9b08b57649f7c8b84715f25312887)) ## v0.18.0 (2023-08-08) ### Feature * Add support for polling Enpower data ([#47](https://github.com/pyenphase/pyenphase/issues/47)) ([`0ac58e0`](https://github.com/pyenphase/pyenphase/commit/0ac58e0396d67b4e858deba08eb6bef5c6de9f39)) ## v0.17.0 (2023-08-07) ### Feature * Add fixtures for 7.6.114 without clamps ([#44](https://github.com/pyenphase/pyenphase/issues/44)) ([`4be0a33`](https://github.com/pyenphase/pyenphase/commit/4be0a339ed9ae458246f2260e03c5d4c89c58410)) ## v0.16.0 (2023-08-07) ### Feature * Collect headers as well as XML files ([#43](https://github.com/pyenphase/pyenphase/issues/43)) ([`82678be`](https://github.com/pyenphase/pyenphase/commit/82678be2bdcd59b77befc04883b2bb4693789f36)) * Update 7.6.175 fixtures ([#45](https://github.com/pyenphase/pyenphase/issues/45)) ([`9c96475`](https://github.com/pyenphase/pyenphase/commit/9c96475f345786a24b5b786a4880a949a01cabd8)) ## v0.15.1 (2023-08-07) ### Fix * Add Encharge classes to __all__ ([#42](https://github.com/pyenphase/pyenphase/issues/42)) ([`229a84d`](https://github.com/pyenphase/pyenphase/commit/229a84df72a1ec6292f47fe426c46890feb1b83e)) ## v0.15.0 (2023-08-07) ### Feature * Add Encharge battery support ([#40](https://github.com/pyenphase/pyenphase/issues/40)) ([`e1a96e9`](https://github.com/pyenphase/pyenphase/commit/e1a96e9de3ade6429561ef863ed8302b481e02df)) ## v0.14.1 (2023-08-07) ### Fix * Probe failures with 5.0.62 firmware ([#38](https://github.com/pyenphase/pyenphase/issues/38)) ([`314df6d`](https://github.com/pyenphase/pyenphase/commit/314df6d83c4dfd7c91970e61f86e34218ce46be8)) ## v0.14.0 (2023-08-06) ### Feature * Add part number ([#36](https://github.com/pyenphase/pyenphase/issues/36)) ([`5b1d46d`](https://github.com/pyenphase/pyenphase/commit/5b1d46dd7c64180fff3118b087330a48de6646fe)) ## v0.13.0 (2023-08-06) ### Feature * Add fixture collecting script ([#30](https://github.com/pyenphase/pyenphase/issues/30)) ([`5d66ee9`](https://github.com/pyenphase/pyenphase/commit/5d66ee96154bbd6238a27b6e449b6bb0aece3a54)) ## v0.12.0 (2023-08-06) ### Feature * Probe for Encharge and Enpower support ([#26](https://github.com/pyenphase/pyenphase/issues/26)) ([`da2db7d`](https://github.com/pyenphase/pyenphase/commit/da2db7d8005c81153dff6b5802d3c4851dd79432)) ## v0.11.0 (2023-08-06) ### Feature * Add support for bifurcated endpoints ([#28](https://github.com/pyenphase/pyenphase/issues/28)) ([`7853cfd`](https://github.com/pyenphase/pyenphase/commit/7853cfd1ecb2e1cadf8e874f6d351c4efe408a79)) ## v0.10.0 (2023-08-06) ### Feature * Add the ability to refresh the token on demand ([#25](https://github.com/pyenphase/pyenphase/issues/25)) ([`d1e391c`](https://github.com/pyenphase/pyenphase/commit/d1e391ccd9fcc9fcb3636f6f4a101005998f9f60)) ## v0.9.0 (2023-08-05) ### Feature * Add EnvoyTokenAuth to __all__ ([#24](https://github.com/pyenphase/pyenphase/issues/24)) ([`738f4c7`](https://github.com/pyenphase/pyenphase/commit/738f4c7b1385e1045e9ca5065e06b0816d6a398f)) ## v0.8.0 (2023-08-05) ### Feature * Add EnvoyData to __all__ ([#23](https://github.com/pyenphase/pyenphase/issues/23)) ([`63f9ba9`](https://github.com/pyenphase/pyenphase/commit/63f9ba94f7d10945aa314836f9a7425cda28ae59)) ## v0.7.1 (2023-08-05) ### Fix * Legacy installer auth was not working ([#22](https://github.com/pyenphase/pyenphase/issues/22)) ([`a2dd5e5`](https://github.com/pyenphase/pyenphase/commit/a2dd5e55ccfc796d7e162ccc75bb116fde1ca631)) ## v0.7.0 (2023-08-05) ### Feature * Export a few more models for type checking ([#21](https://github.com/pyenphase/pyenphase/issues/21)) ([`e2337c4`](https://github.com/pyenphase/pyenphase/commit/e2337c4b8bf69e816611e76e4239fdbea78bf6e9)) ## v0.6.1 (2023-08-05) ### Fix * Unclosed cloud client session ([#20](https://github.com/pyenphase/pyenphase/issues/20)) ([`b46282a`](https://github.com/pyenphase/pyenphase/commit/b46282a9f9ed20be4487582cd2461a02b7740de6)) ## v0.6.0 (2023-08-05) ### Feature * Export names at top level ([#19](https://github.com/pyenphase/pyenphase/issues/19)) ([`b209357`](https://github.com/pyenphase/pyenphase/commit/b2093578d12978da49788ca08c3959d2c3fb3641)) ## v0.5.0 (2023-08-05) ### Feature * Add consumption api ([#17](https://github.com/pyenphase/pyenphase/issues/17)) ([`f094c4d`](https://github.com/pyenphase/pyenphase/commit/f094c4d129cbb26e0f6bf3cf9024967a0def46e7)) ## v0.4.0 (2023-08-05) ### Feature * Add update functions ([#16](https://github.com/pyenphase/pyenphase/issues/16)) ([`d2802e0`](https://github.com/pyenphase/pyenphase/commit/d2802e0e9322050d37e0affa4a87f127731c29a2)) ## v0.3.0 (2023-07-26) ### Feature * Add support for legacy firmware ([#11](https://github.com/pyenphase/pyenphase/issues/11)) ([`49cb15c`](https://github.com/pyenphase/pyenphase/commit/49cb15c58cde38dc41ff30c24c3365c491605274)) ## v0.2.0 (2023-07-26) ### Feature * Use sessionId cookie to have access to some endpoints ([#7](https://github.com/pyenphase/pyenphase/issues/7)) ([`09a1a8a`](https://github.com/pyenphase/pyenphase/commit/09a1a8aa30f2e3be1aa636f2488dc736f4d4f476)) ## v0.1.0 (2023-05-28) ### Feature * Add initial cloud auth support ([#6](https://github.com/pyenphase/pyenphase/issues/6)) ([`28f4872`](https://github.com/pyenphase/pyenphase/commit/28f4872625a01ee209153d489de566b7ba2302e6)) ## v0.0.3 (2023-05-23) ### Fix * Permission ([`89f9399`](https://github.com/pyenphase/pyenphase/commit/89f9399bccafcc611d83e264d8f4795d43a7f34e)) * Permission ([`c73e3ed`](https://github.com/pyenphase/pyenphase/commit/c73e3ed86106d6a9b4ea78c37c1a3133ef0af458)) * Permission ([`39e5209`](https://github.com/pyenphase/pyenphase/commit/39e520904e649bb37bd13c790d221b455b4dc90b)) * Permission ([`2068511`](https://github.com/pyenphase/pyenphase/commit/2068511f19a8c2c9ac8322937c830762cba27a16)) * Test publish ([#2](https://github.com/pyenphase/pyenphase/issues/2)) ([`e3df6b2`](https://github.com/pyenphase/pyenphase/commit/e3df6b264ca55dc12b75dd602cc1f92fa3a54950)) * Update ci python version ([#1](https://github.com/pyenphase/pyenphase/issues/1)) ([`4c2dd2e`](https://github.com/pyenphase/pyenphase/commit/4c2dd2e70464b884b9d8a02ccaf39f04f46ab270)) * Drop 3.12 ([`8e0c0f4`](https://github.com/pyenphase/pyenphase/commit/8e0c0f40ad38152bc13a85566d67c7e86345d291)) * Lint ([`683691c`](https://github.com/pyenphase/pyenphase/commit/683691c730e1ef4c491348d66dce70cd75917fd1)) * Typing ([`a75ae30`](https://github.com/pyenphase/pyenphase/commit/a75ae303ef4f98cfafe95081901df7ce88f4fb9e)) * Bump versions ([`eef5623`](https://github.com/pyenphase/pyenphase/commit/eef56234a9353d110b174b445da1cfb4034d7c1f)) pyenphase-pyenphase-1bfa6dd/CONTRIBUTING.md000066400000000000000000000074121464551303400205130ustar00rootroot00000000000000# Contributing Contributions are welcome, and they are greatly appreciated! Every little helps, and credit will always be given. You can contribute in many ways: ## Types of Contributions ### Report Bugs Report bugs to [our issue page][gh-issues]. If you are reporting a bug, please include: - Your operating system name and version. - Any details about your local setup that might be helpful in troubleshooting. - Detailed steps to reproduce the bug. ### Fix Bugs Look through the GitHub issues for bugs. Anything tagged with "bug" and "help wanted" is open to whoever wants to implement it. ### Implement Features Look through the GitHub issues for features. Anything tagged with "enhancement" and "help wanted" is open to whoever wants to implement it. ### Write Documentation pyenphase could always use more documentation, whether as part of the official pyenphase docs, in docstrings, or even on the web in blog posts, articles, and such. ### Submit Feedback The best way to send feedback [our issue page][gh-issues] on GitHub. If you are proposing a feature: - Explain in detail how it would work. - Keep the scope as narrow as possible, to make it easier to implement. - Remember that this is a volunteer-driven project, and that contributions are welcome 😊 ## Get Started! Ready to contribute? Here's how to set yourself up for local development. 1. Fork the repo on GitHub. 2. Clone your fork locally: ```shell $ git clone git@github.com:your_name_here/pyenphase.git ``` 3. Install the project dependencies with [Poetry](https://python-poetry.org): ```shell $ poetry install ``` 4. Create a branch for local development: ```shell $ git checkout -b name-of-your-bugfix-or-feature ``` Now you can make your changes locally. 5. When you're done making changes, check that your changes pass our tests: ```shell $ poetry run pytest ``` 6. Linting is done through [pre-commit](https://pre-commit.com). Provided you have the tool installed globally, you can run them all as one-off: ```shell $ pre-commit run -a ``` Or better, install the hooks once and have them run automatically each time you commit: ```shell $ pre-commit install ``` 7. Commit your changes and push your branch to GitHub: ```shell $ git add . $ git commit -m "feat(something): your detailed description of your changes" $ git push origin name-of-your-bugfix-or-feature ``` Note: the commit message should follow [the conventional commits](https://www.conventionalcommits.org). We run [`commitlint` on CI](https://github.com/marketplace/actions/commit-linter) to validate it, and if you've installed pre-commit hooks at the previous step, the message will be checked at commit time. 8. Submit a pull request through the GitHub website or using the GitHub CLI (if you have it installed): ```shell $ gh pr create --fill ``` ## Pull Request Guidelines We like to have the pull request open as soon as possible, that's a great place to discuss any piece of work, even unfinished. You can use draft pull request if it's still a work in progress. Here are a few guidelines to follow: 1. Include tests for feature or bug fixes. 2. Update the documentation for significant features. 3. Ensure tests are passing on CI. ## Tips To run a subset of tests: ```shell $ pytest tests ``` ## Making a new release The deployment should be automated and can be triggered from the Semantic Release workflow in GitHub. The next version will be based on [the commit logs](https://python-semantic-release.readthedocs.io/en/latest/commit-log-parsing.html#commit-log-parsing). This is done by [python-semantic-release](https://python-semantic-release.readthedocs.io/en/latest/index.html) via a GitHub action. [gh-issues]: https://github.com/pyenphase/pyenphase/issues pyenphase-pyenphase-1bfa6dd/LICENSE000066400000000000000000000020531464551303400172630ustar00rootroot00000000000000 MIT License Copyright (c) 2023 pyenphase 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. pyenphase-pyenphase-1bfa6dd/README.md000066400000000000000000000066241464551303400175450ustar00rootroot00000000000000# pyenphase

CI Status Documentation Status Test coverage percentage

Poetry black pre-commit

PyPI Version Supported Python versions License

Library to control enphase envoy ## Installation Install this via pip (or your favourite package manager): `pip install pyenphase` ## Contributors ✨ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! ## Credits This package was created with [Copier](https://copier.readthedocs.io/) and the [browniebroke/pypackage-template](https://github.com/browniebroke/pypackage-template) project template. pyenphase-pyenphase-1bfa6dd/commitlint.config.js000066400000000000000000000003641464551303400222420ustar00rootroot00000000000000module.exports = { extends: ["@commitlint/config-conventional"], rules: { "header-max-length": [0, "always", Infinity], "body-max-line-length": [0, "always", Infinity], "footer-max-line-length": [0, "always", Infinity], }, }; pyenphase-pyenphase-1bfa6dd/devtools/000077500000000000000000000000001464551303400201155ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/devtools/experiment.py000066400000000000000000000024671464551303400226600ustar00rootroot00000000000000import asyncio import logging import os from pprint import pprint from pyenphase.envoy import Envoy logging.basicConfig(level=logging.DEBUG) async def main() -> None: envoy = Envoy(os.environ.get("ENVOY_HOST", "envoy.local")) await envoy.setup() username = os.environ.get("ENVOY_USERNAME") password = os.environ.get("ENVOY_PASSWORD") token = os.environ.get("ENVOY_TOKEN") await envoy.authenticate(username=username, password=password, token=token) # Test https://enphase.com/download/iq-gateway-access-using-local-apis-or-local-ui-token-based-authentication-tech-brief endpoints print(await envoy.update()) end_points = [ "/ivp/livedata/status", "/api/v1/production", "/api/v1/production/inverters", "/production.json", "/production", "/ivp/meters", "/ivp/meters/readings", "/ivp/meters/reports/consumption", "/ivp/ensemble/inventory", "/ivp/ensemble/dry_contacts", "/ivp/ss/dry_contact_settings", ] for end_point in end_points: try: json_dict = await envoy.request(end_point) except Exception as e: print(e) continue print((end_point, "=" * 80)) pprint(json_dict) print((end_point, "=" * 80)) asyncio.run(main()) pyenphase-pyenphase-1bfa6dd/devtools/fixture_collector.py000066400000000000000000000200731464551303400242250ustar00rootroot00000000000000"""Create test fixture file set for pyenphase by scanning known endpoints on Envoy. execute python fixture_collector.py --help for directons Copy this file to the Home Assistant config folder. Open a terminal on your HA system Navigate to the config folder and execute python fixture_collector.py Alternatively copy and execute this file to a system with pyenphase installed and network connectivity to your Home Assistant config folder and the Envoy. """ import argparse import asyncio import getpass import json import logging import os import zipfile from pyenphase.envoy import DEFAULT_HEADERS, Envoy from pyenphase.exceptions import ( EnvoyAuthenticationRequired, EnvoyFirmwareFatalCheckError, ) # logging.basicConfig(level=logging.WARNING) async def main( envoy_address: str | None, username: str | None, password: str | None, token: str | None, verbose: bool = False, label: str = "", clean: bool = False, ) -> None: envoy = Envoy(os.environ.get("ENVOY_HOST", envoy_address or "envoy.local")) try: await envoy.setup() except EnvoyFirmwareFatalCheckError as err: print(f"Could not connect to Envoy: {err.status_code} {err.status}") return None try: await envoy.authenticate(username=username, password=password, token=token) except EnvoyAuthenticationRequired: print("Could not athenticate with Envoy") return None target_dir = f"enphase-{envoy.firmware}{label}" try: os.mkdir(target_dir) except FileExistsError: pass end_points = [ "/info", "/api/v1/production", "/api/v1/production/inverters", "/production.json", "/production.json?details=1", "/production", "/ivp/ensemble/power", "/ivp/ensemble/inventory", "/ivp/ensemble/dry_contacts", "/ivp/ensemble/status", "/ivp/ensemble/secctrl", "/ivp/ss/dry_contact_settings", "/admin/lib/tariff", "/ivp/ss/gen_config", "/ivp/ss/gen_schedule", "/ivp/sc/pvlimit", "/ivp/ss/pel_settings", "/ivp/ensemble/generator", "/ivp/meters", "/ivp/meters/readings", ] assert envoy.auth # nosec for end_point in end_points: url = envoy.auth.get_endpoint_url(end_point) if verbose: print(end_point) try: response = await envoy._client.get( url, headers={**DEFAULT_HEADERS, **envoy.auth.headers}, cookies=envoy.auth.cookies, follow_redirects=True, auth=envoy.auth.auth, timeout=envoy._timeout, ) except Exception: continue # nosec file_name = end_point[1:].replace("/", "_").replace("?", "_").replace("=", "_") with open(os.path.join(target_dir, file_name), "w") as fixture_file: fixture_file.write(response.text) with open( os.path.join(target_dir, f"{file_name}_log.json"), "w" ) as metadata_file: metadata_file.write( json.dumps( { "headers": {k: v for k, v in response.headers.items()}, "code": response.status_code, } ) ) if not clean or verbose: print(f"Fixtures written to {target_dir}") zip_file_name = f"{target_dir}.zip" with zipfile.ZipFile(zip_file_name, "w") as zip_file: for file_name in os.listdir(target_dir): zip_file.write(os.path.join(target_dir, file_name), file_name) if clean: os.remove(os.path.join(target_dir, file_name)) print(f"Zip file written to {zip_file_name}") if clean: try: os.rmdir(target_dir) if verbose: print(f"Removed {target_dir}") except OSError as err: print(f"Could not clean folder: {err.strerror}") except FileNotFoundError: pass def _read_ha_config(file_path: str) -> dict[str, list[str | None]]: result: dict[str, list[str | None]] = {} try: with open(file_path) as fp: content = json.load(fp) except (FileNotFoundError, ValueError): return result if content: for entry in content["data"]["entries"]: if entry["domain"] != "enphase_envoy" or entry["source"] == "ignore": continue data = entry["data"] unique_id = entry["unique_id"] result[unique_id] = [ data["host"], data["username"], data["password"], data["token"], ] return result if __name__ == "__main__": description = "Scan Enphase Envoy for endpoint list usable for pyenphase test fixtures. \ Creates output folder envoy_[label] with results of scan.\ Zips content of created folder into envoy_[label].zip.\ " parser = argparse.ArgumentParser(description=description) parser.add_argument( "-d", "--debug", help="Enable debug logging", action="store_true" ) parser.add_argument("-v", "--verbose", action="store_true") parser.add_argument( "-c", "--clean", help="Remove created folder, but keep zip file", action="store_true", ) parser.add_argument( "-l", "--label", help="Label to append to output folder and zip file names" ) parser.add_argument( "-r", "--readhaconfig", const=".", nargs="?", dest="ha_config_folder", help="Read envoyname, username, password and token from HA config folder.\ Use -r path_to_ha_config_folder. Default is current folder.\ Overrides any specified username, password and token.", ) parser.add_argument( "-e", "--envoyname", default="envoy.local", help="Envoy Name or IP address. IP is preferred, default is envoy.local", ) parser.add_argument( "-u", "--username", help="Username (for Envoy or for Enphase token website)" ) parser.add_argument( "-p", "--password", help="Password (blank or for Enphase token website)" ) parser.add_argument( "-t", "--token", help="Enphase owner token or @path_to_file to read from file" ) args = parser.parse_args() if args.debug: logging.basicConfig(level=logging.DEBUG) host = args.envoyname username: str | None = args.username password: str | None = args.password read_ha_config: str = args.ha_config_folder verbose: bool = args.verbose config_entries: dict[str, list[str | None]] = {} target_ha_file: str = "" if args.ha_config_folder: target_ha_file = os.path.join(read_ha_config, ".storage/core.config_entries") config_entries = _read_ha_config(target_ha_file) else: username = args.username password = args.password token = args.token if not username: username = os.environ.get("ENVOY_USERNAME", input("Enter the Username: ")) if not password: password = os.environ.get( "ENVOY_PASSWORD", getpass.getpass("Enter the Password: ") ) if not token: token = os.environ.get("ENVOY_TOKEN", getpass.getpass("Enter the token: ")) if token and token[0] == "@": try: with open(token[1:]) as f: token = f.read() except FileExistsError: token = None config_entries.update({"unknown": [host, username, password, token]}) for sn, configs in config_entries.items(): host, username, password, token = configs if verbose: print(f"Using {host} sn: {sn}, {target_ha_file}") asyncio.run( main( envoy_address=host, username=username, password=password, token=token, verbose=verbose, label=args.label or "", clean=args.clean, ) ) pyenphase-pyenphase-1bfa6dd/docs/000077500000000000000000000000001464551303400172065ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/docs/Makefile000066400000000000000000000011721464551303400206470ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) pyenphase-pyenphase-1bfa6dd/docs/_static/000077500000000000000000000000001464551303400206345ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/docs/_static/.gitkeep000066400000000000000000000000001464551303400222530ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/docs/advanced.md000066400000000000000000000301471464551303400213020ustar00rootroot00000000000000# Advanced Usage ## Bring your own endpoint The pyenphase package can be used to obtain Envoy data from endpoints not already collected. Access to these endpoint is enabled by the [Authorization level](./usage_authentication.md#authorization-levels) set during authentication. Data is returned directly to the caller and not stored in the Envoy data model. ```python envoy = Envoy(host_ip_or_name) await envoy.setup() await envoy.authenticate(username=username, password=password, token=token) myresponse: httpx.Response = await envoy.request('/my/own/endpoint') status_code = response.status_code if status_code in (HTTPStatus.UNAUTHORIZED, HTTPStatus.FORBIDDEN): # authentication error content = myresponse.content ``` ## Register updater The package can be extended by registering an additional `updater` as a sub class of `EnvoyUpdater`. Such an updater can serve as an alternative data source for existing data sources and provide requested data if other updaters don't. The added updater can only store data in one of the existing data attributes of [EnvoyData](#pyenphase.EnvoyData) or store the raw data in Envoy's [`raw`](./data_raw.md#raw-data) attribute. An updater requires 2 methods. A `probe` method which is used to initialize the updater and is only called once and signals capability to provide the data, and an `update` method which is called repeatidly to collect the data. Each may collect the same or different data based on the needs. The updater will have to provide same data as other updaters for the data attributes in scope. ### Example: Extend EnvoySystemProduction The [EnvoySystemProduction](#pyenphase.models.system_production.EnvoySystemProduction) class provides overall [production data](./data_production.md) reported by the Envoy. The data is sourced from various endpoints based on Envoy type and the firmware running in the Envoy. This package does not include reporting from Envoy Legacy HTML pages.[^1] [^1]: Prime intent during design was to work with [Home Assistant](https://www.home-assistant.io/) and Home Assistant has an [architectural rule denying the use of webscraping](https://github.com/home-assistant/architecture/blob/master/adr/0004-webscraping.md) for core integrations. Though it allows scraping for custom integrations. This package however can be used to build any application, hence this example. #### Legacy Envoy SystemProduction This example will get production data from legacy Envoy html production page and report it in the existing EnvoySystemProduction class also used for other Envoy versions. First step is to define a data model as a sub-class of [EnvoySystemProduction](#pyenphase.models.system_production.EnvoySystemProduction) and its method to obtain the data from the returned Envoy html. In below example the method 'from_production_legacy' provides this. The returned data should be the EnvoysSystemProduction class members. ```python from pyenphase import EnvoyData, EnvoySystemProduction, register_updater from pyenphase.const import URL_PRODUCTION, SupportedFeatures from pyenphase.envoy import get_updaters from pyenphase.exceptions import ENDPOINT_PROBE_EXCEPTIONS # regex to find production data in html page _KEY_TO_REGEX = { "watts_now": r"Current.*\s*\s*(\d+|\d+\.\d+)\s*(W|kW|MW)", "watt_hours_last_7_days": r"Past Week\s*\s*(\d+|\d+\.\d+)\s*(Wh|kWh|MWh)", "watt_hours_today": r"Today\s*\s*(\d+|\d+\.\d+)\s*(Wh|kWh|MWh)", "watt_hours_lifetime": r"Since Installation\s*\s*(\d+|\d+\.\d+)\s*(Wh|kWh|MWh)", } class LegacyEnvoySystemProduction(EnvoySystemProduction): """Get production data from legacy Envoy html""" def from_production_legacy(cls, text: str) -> EnvoySystemProduction: """Legacy parser.""" data: dict[str, int] = { "watts_now": 0, "watt_hours_today": 0, "watt_hours_last_7_days": 0, "watt_hours_lifetime": 0, } # extract the date from the html using regex for key, regex in _KEY_TO_REGEX.items(): if match := re.search(regex, text, re.MULTILINE): unit = match.group(2).lower() value = float(match.group(1)) # scale units to w or wh if unit.startswith("k"): value *= 1000 elif unit.startswith("m"): value *= 1000000 data[key] = int(value) return cls(**data) ``` #### LegacyProductionScraper Next define the actual updater as a subclass of [EnvoyUpdater](#pyenphase.updaters.base.EnvoyUpdater). The updater will collect the data and use above model to report the data. ```python class LegacyProductionScraper(EnvoyUpdater): ``` ##### Probe As described before, the `probe` method is called once at initialization to detect and configure all that is needed. It is passed the bit mask (flags) of already `SupportedFeatures` by other updaters. If the feature this updater provides is already provided by an other updater, ours should exit and leave it to the other updater. In this example the feature flag is `SupportedFeatures.PRODUCTION`. If not set yet, the updater should configure and return `SupportedFeatures.PRODUCTION` flag set to signal the Envoy class it should be used to obtain data or None if not. Returning a set SupportedFeatures flag will cause the update method to be used during data collection. To collect the data the EnvoyUpdater class provides the methods `_probe_request(endpoint)` and `_json_probe_request(endpoint)`. These methods can be used retrieve text/html or json data. ```python async def probe( self, discovered_features: SupportedFeatures ) -> SupportedFeatures | None: """Probe the Envoy for for Production HTML and return PRODUCTION SupportedFeature.""" if SupportedFeatures.PRODUCTION in discovered_features: # Already discovered from another updater, leave alone return None try: # get html data from the envoy using the probe_request response = await self._probe_request(URL_PRODUCTION) data = response.text except ENDPOINT_PROBE_EXCEPTIONS: return None # check if response contains what we expect if "Since Installation" not in data: return None # remember and return PRODUCTION as my supported feature. self._supported_features |= SupportedFeatures.PRODUCTION return self._supported_features ``` ##### Update The `update` method is called at each update cycle to provide the actual data. It is passed the EnvoyData class to store the data to. The data colloction methods provided by the EnvoyUpdater class are `_json_request(endpoint)` and `_request(endpoint)`. Typically the method uses a data model to extract the data from the response. ```python async def update(self, envoy_data: EnvoyData) -> None: """Update the Envoy for this updater.""" # Get the HTML data from the Envoy response = await self._request(URL_PRODUCTION) production_data = response.text # Store the data as is in the raw json of the EnvoyData envoy_data.raw[URL_PRODUCTION] = production_data # Store data in Envoy data using our data model. envoy_data.system_production = ( LegacyEnvoySystemProduction.from_production_legacy(production_data) ) ``` ##### Register updater To make the updater available for use, it must be registered with the Envoy using `register_updater`. Upon completion of the registration perform the usual setup, authentication and probe of the Envoy and start data collection. ```python # Initialize Envoy, setup and authenticate envoy = Envoy(host) # register our updater for legacy envoy remove = register_updater(LegacyProductionScraper) assert LegacyProductionScraper in get_updaters() # setup and authenticate with Envoy await envoy.setup() await envoy.authenticate(username=username, password=password, token=token) # probe what endpoints are available await envoy.probe() # get data, the production values now fill from html data: EnvoyData = await envoy.update() # remove our updater from the envoy remove() assert LegacyProductionScraper not in get_updaters() ``` Registering the updater inserts it at the end of the updaters giving priority to existing updaters to return production (in this example) data. If all prior ones fail, the newly registered one will be used. Adding a new one only makes sense for cases where the endpoint is not successfully accessed by the other ones. This is implemented by the use of the SupportedFeatures flags. ### Example: New attribute EnvoyHomeInformation The previous example [Extend EnvoySystemProduction](#example-extend-envoysystemproduction) added a new data source for an existing attribute. Similarly a datasource for a new attribute can be added by registering an updater. The process is the same as the previous example with only difference being no existing EnvoyData attribute available and the EnvoyData.raw is to be used. This example will add retrieval of data from the Envoy Home endpoint /home.json. #### EnvoyHomeInformation The datamodel to use is new and designed towards the needs. ```python from pyenphase import EnvoyData, EnvoySystemProduction, register_updater from pyenphase.const import URL_PRODUCTION, SupportedFeatures from pyenphase.envoy import get_updaters from pyenphase.exceptions import ENDPOINT_PROBE_EXCEPTIONS @dataclass(slots=True) class EnvoyHomeInformation(): """Get home data from Envoy""" software_build_epoch: int timezone: str @classmethod def from_home(cls, data: dict[str, Any]): """Initialize from the Home API.""" return cls( software_build_epoch=data["software_build_epoch"], timezone=data["timezone"], ) ``` #### EnvoyHome As described, the updater is a subclass of [EnvoyUpdater](#pyenphase.updaters.base.EnvoyUpdater) and provides `probe` and `update` methods. As this is a new attribute no SupportedFeatures flags exists for it. The next higher flag is used to signal back this updater has data to provide. [^2] [^2]: When adding multiple new unique features make sure flags are unique by adding more left shits as needed `myflag = 1 << (len(SupportedFeatures) + 1)`. ```python class EnvoyHome(EnvoyUpdater): async def probe( self, discovered_features: SupportedFeatures ) -> SupportedFeatures | None: """Probe the Envoy for home information.""" myflag = 1 << len(SupportedFeatures) if myflag & discovered_features: # Already discovered from another updater return None try: home_json: dict[str, Any] = await self._json_probe_request("/home.json") except ENDPOINT_PROBE_EXCEPTIONS: return None # our data not found in the page if "software_build_epoch" not in home_json: return None # signal we can provide this data self._supported_features |= myflag return self._supported_features async def update(self, envoy_data: EnvoyData) -> None: """Update the Envoy for this /home.json.""" home_data = await self._json_request("/home.json") # No EnoyData attribute, only return raw as is envoy_data.raw["/home.json"] = home_data ``` As there's no EnvoyData attribute to store the `EnvoyHome` data it should be obtained by the application using the model. ```python # Initialize Envoy, setup and authenticate envoy = Envoy(host) # register our updater for legacy envoy remove = register_updater(EnvoyHome) assert EnvoyHome in get_updaters() # setup and authenticate with Envoy await envoy.setup() await envoy.authenticate(username=username, password=password, token=token) # probe what endpoints are available await envoy.probe() # get data, the production values now fill from html data: EnvoyData = await envoy.update() # obtain our data from raw using the model home_info: EnvoyHomeInformation = ( EnvoyHomeInformation.from_home(data.raw['/home.json']) ) print(f'Home info: {home_info.timezone}') ``` pyenphase-pyenphase-1bfa6dd/docs/changelog.md000066400000000000000000000000421464551303400214530ustar00rootroot00000000000000```{include} ../CHANGELOG.md ``` pyenphase-pyenphase-1bfa6dd/docs/conf.py000066400000000000000000000022751464551303400205130ustar00rootroot00000000000000# Configuration file for the Sphinx documentation builder. # # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information project = "pyenphase" copyright = "2023, pyenphase" author = "pyenphase" release = "1.14.0" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration extensions = [ "myst_parser", "sphinx.ext.autodoc", "sphinx.ext.napoleon", "sphinx_autodoc_typehints", ] # The suffix of source filenames. source_suffix = [ ".rst", ".md", ] templates_path = ["_templates"] exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # Generate internal ancjors for headings myst_heading_anchors = 4 # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output html_theme = "sphinx_rtd_theme" html_static_path = ["_static"] pyenphase-pyenphase-1bfa6dd/docs/contributing.md000066400000000000000000000000451464551303400222360ustar00rootroot00000000000000```{include} ../CONTRIBUTING.md ``` pyenphase-pyenphase-1bfa6dd/docs/ct-model.png000066400000000000000000000700051464551303400214220ustar00rootroot00000000000000‰PNG  IHDR`ª¬ðøŸ IDATxí½mð&W]çÚ²¬}á R[·[·ÖZq‡]÷Á-΋]ˇPeU”E*»lmjÕuA¹•AÄlŒÊ(Y@a"˜BF&<˜ Œ&$Yè"&1“„²™D f€˜€F=w}zæ{Íï:ÿÓ×s÷ÕßSÕÿî>¿ó9§û|ûôù÷uV²3000h•ÀY­–æÂLÀLÀLÀLÀ’˜; ˜€ ˜€ ˜€ ´LÀ¬eà.ÎL ¥w½ó]Æ`&`£&`6êæwåM`;,À¶ÃÝ¥š€ t‡€XwÚ–˜ÀhX€¦©]Q0`5`ìm&`&`&`M°kЬó5000`5`ìm&`&`&`M°kЬó5¨%à5`µh`&0`#ihWÓºDÀ¬K­a[LÀ¶AÀlÔ]¦ Œœ€ØÈ;€«o&à/Ộ€ ˜€ ˜€ ˜@Û<Ö6q—g&`&`&0z`£ï`&`&`&Ð6 °¶‰»<0ÿ¤û€ ˜Àè X€¾ € ´OÀ‹ðÛgîMÀºEÀ¬[íakL`,ÀFÑÌ®¤ ˜À `3à8ÈLÀLÀLÀš `ÖUçi&`&`&`3X€Í€ã 000h‚€XT§ ˜ÀL^6MÀF@Àlì*š@×X€u­El ˜@Û,ÀÚ&îòLÀü0÷0Ѱ}0000¶ X€µMÜ噀 ˜€ ˜€ Œž€Øè»€˜€ ˜€ ˜€ ´MÀ¬mâ.ÏLÀkÀÜLÀFOÀlô]ÀL }þ/Èö™»D0n°ëV{Ø °Q4³+i&0ƒ€Ø 82000&X€5AÕyš€ ˜€ ˜€ ˜À `3à8ÈLÀLÀLÀš `ÖUçi&0“€×€ÍÄã@0°A#»Š&Ð5`]kÛc&Ð6 °¶‰»<0Ì}ÀL`ô,ÀFß ÀLÀLÀL m`mwy&`&`&`£'`6ú.`&`&`&`m°k›¸Ë3ð0÷0Ѱ}0ØIàØ±ciÏž=i×®]鬳Ϊ6Žñ;räÈÎKúð_çŸ~•ï’IÝLÀAÀlÍèJ˜Àæ=z4}öÙÑ…PbÛ½{÷DŒ6è  °¾´”í400  °Á4¥+b&`&`&Ð`}i)Ûi"À0;03 °1·¾ën["`¶%ð.ÖL 3,À:Ó6ÄÆCÀl|8±5éøy$Øé÷(õóK*W?{¹Æã&msÞ&`Ã"`6¬ötmL " †`Ð&?‰‰M¢ZV€Í+¡ÈoQFÇoBò‘M9ÄeðÛ””ŸsÃ8òçw/Uoù5e›ó5 °áµ©kdÕ,â w~ÐzÓNBdSù"›°s–}”‰ø:zôèŽh C€É!ºJŒî½ ˜€ Ì"°ó=+¶ÃLÀzA@³]¹±QØ p8g¦) ‰ üJ¯-™AÓ+:ö–(Àb*¿Xþy9š™Ã.âj““½Ê1´gÏžIÄELàc#Šˆ#q„A„à‘`R Ÿˆ(·‡5`ä«4z'SÊ#`.üHƒ-äAž1Ω3vâ_÷“ôÔ ±¶¨ÃvÒØ™€ ˜À*|÷X…šÓ˜@Ç Hð ´ÉOb ñ’¯³B°ä"„8y ТCØ D$¦JâIe+,/‡2ˆ‡+å˜fÝ$¶”/y¨Nä!»Ž_n?aSªƒâÏÚ+ͬ830:`udìo=&€Ð@Å áEO4TU¢&!¤ÑLiØr·Œ£X^NÌsžÓŒYLÃ1¯e_)qÉÓy,'âs0¦ X€5MØù›ÀÔ hÊ¢Œ3 °ø 3浬‹ñc>:.‰§hocökF¹Ôº5`ˆFòe/ç0‘ðÞL``«Psè8UUjë$,ÎÆQvXó˜fëæ½‚”SsÍâBõ"+¦#,: °HÃÇ&`˰[–˜ã›@Ì2? ù1ƒÄL^Ö-Â'^Û|⌖^Y’–pf«È“8r”ƒ Q9šÑÒ¹òˆ+·—õ]ø§n>áÑÍâBä)Š-lJ“ FÂbb9>60yÎÜçÅt¸ ˜@oH4Ì284ŠKZDâ"_7F„•‚E³QOÄA`‘ž×zñ5&á¬ËË!ŽbûH/•ÛKòV9²Ey¿ÒF?â×9ò$ê§ò£mJk&Þ›€ ¬B þN´JnNc&` @€Ù™€ ˜À˜ X€¹õ]÷a8tèL½x ¥K/íÜùD€uÁ¾;î8ÃÇG&`&Ð °–@»hÀå—Ÿ]ˆ›óÎKéå/÷9"´ŽÇÉ“­5 20° ïM`H]ˆ/DÎç³y ©í]0^°ëE3ÙHX€Ä—’ú\$NísÓ¡>30F X€5Š×™›€ ”LÖ€•íg&`# `6‚FvM k,ÀºÖ"¶ÇL m`mwy&`ÕwÀŒÁLÀÆLÀḽﺛ€ ˜€ ˜€ l…€ØV°»P0001°së»î&`&`&`[!`¶ì.ÔÆMÀ‹ðÇÝþ®½ ˜@J`î&`­°k¹ 4è °Ž5ˆÍ11°C+»Ž&`³X€Í¢ã0000h€€XP¥ ˜Àf 9r$þù›ÍÔ¹™€ ˜À X€m¾‹6& VÎ:ë¬tðàÁtöÙgWÇ{öìI'NœH‡N»víš{ôèÑI\y"tH›çÃù¶œضȻ\0¦X€5EÖùšÀ–H8!ºp¯Ý»w§}ûöUçˆ2„?YŒ‹x#ṀóMºE×€!±'ß¶)7ÉÁy™€ Œ—€ØxÛÞ5( §X=f´ô ï /Lû÷﯂ñcV Q†ãXñJùÄ<×9^T€© l‘]òóÞLÀúLÀ¬Ï­gÛM @ $œ¢€‘cVK‹2fÅöîÝ;g¥|bqqVЏ‹º}‡nª~ ’ý¢.Ú¿hÇ30.°ërëØ6X@I8It‘ ñ„Ÿ^="¼ô:òرcU©¥|V0gG’ÿ繯HÚvÖxX€Õ€±· ˜@o X€õ¶él¸ ” H8iÍ‚+®#¯óXû…цsâÉ)oj/ñÅÞÎLÀÆJÀl¬-ïz–€„LÿÉ Wt¬c,.®'nŒ§|bºM[€m‚¢ó0è; °¾· í7Œ@SÂ)+fåS‹ð=¶2B'4 °4¢«`<¾üå/W³[•ßÇ>6 ÚÈùLç·Â™Ø МÄL`p,Àפ®Ð¨ ÜqGJçw Á)]pÁfÏ/½tm¼`k#t&` `6€FtL`г^眓ÒE¥tòdJ›>Ÿ*lù˜¶åS;… ˜€ ƒ€Ø0Úѵ0i¼*D|Émú\ù®°—øbog&`c%`6Ö–w½M`K,À¶ÞÅš€ tŠ€X§šÃƘÀð Àúü_|¨VßXSkñ]µøË:VxöúïXÙÆ»ùù©èð'î²Nù/›ÎñM`¬,ÀÆÚò®· l‰@ßXIh drQÖ&^ÊÖGuëÊÍíFH’†ï¿Å´`uío›%`¶YžÎÍL`®0>:‹øÐ/ð[˜rÇY-~²‰ÖJÄhI¢kž#>¿å—8¦LýäeÆòrADÞØÊž ‡`"Îõ]ò#ÿ(¦ˆK8a²½Ê ü‘ÓGy%À8ç8ÚI”‹#œvW}°‘c;0ÅøjYŒ“c™€ lˆ@Ö€IÀHt Ž$n¨&"CâŠ8„W2„+~ Âq$1Cüø«”§ü)sÊÁ¥sòà\¶ó Q¢(¯a¤Ç•ì®Rª„“òÇV#°dq¢²›c±ƒs 0õÞæ°›ÏÈ1LÀ6H   g¼døë¸Tí’Aä&n>ä¿D çˆ5…—ÊCäHÐOǤ%ÀB”%¡‡(ÒŒXÉnÕ/ÚIá'n1ùÌÊ_åxo&p†€Ø>, BT‹sŒ|‹ƒâ¶«¯,ÚÈà§o“öÁC`“ù.’WL™½/û8{£v¨«K)<IyÚ\¬DþÊ<´1£¥ö)å͈!ˆûuѬaš)S9¹mœGûâ1a”õÄlZcy¼Yù—Ê´Ÿ Œ€ØØ{À@ëŸqÀÛF•)_3uåç˜^ë0nÚm“GÖ€!`` Ù#fè?u.ÆUœ’HRûYý‘òfµqž7ñõÊ1–¡c %öˆ1¹’Ý„Ñ/)_B-·U‚N{å—Ç«Ë_ñ½7˜&P—™Žç3h¶(`$Nؤ4 ?ùcø<ÁA\f xÂç˜2ã ySa VÑå!ËvÒŸ0ò#ÿ˜Û'¬4€å~ÑlaP„ƒm>(c—`Ò©nØ„a¿®ûø§Hw?ø…¥²YU€iæl©Âj"Sw 0øÁžr°T8~Q°ÑVÄ•`!<æ§<âžø´¥œúŒÎó~AyZkUÊ?òÔFüØ_±Ÿêó•=Ëî/xÍÛÓ3~õ-K%낃Lh71äXŽpüñc£Ԟġo(-ç1®Ò°—ãXý¿¼?Î*¼Õ椥Mc_Çóû¨_tê_Ñ>òVQ\ò!N̼ˆúq GÌqlg&°_-‹qr¬– ps–™ü:.™Æ@Ã5¨à7¥-Å×€ÃàHxt p Ø+.qf 0êE^ÄÁ1°kF {£m#”äJv(LyI4F8åãæ6ǰE™ýÒ¬Ô2³`JÃ~§tˤbܻ(À$Ä©3‚,ž‘ƒëd}'0=ªô½6¶0*ˆÍÔH@IT!Nt\ªt>OpÌŠ/ƒÈÒgJy3"€ˆO\‘õÒàHuÅ©Åßôä_ W<í)ƒüp1‰±<_ÂK6+ŸE÷Ì~I-3 ¦4[`‡©"¿—É–ËõàüoögÓC=”žö´§¥¾ÿýé“ßó=é/þâ/ª|ñ¾ûÒMO{ZºÿþûÓc=vê÷@·]?~ ÞÎL` °HìÑÄGtQ$­2–çW—7þQ ÄÙ¤˜FÇ1.~Q)NÜóÊaÉ1&WJÄ‘¨"_Ìr{Ú·”onó¬46Ïg:wŸ™Àè X€¾ À¦ Üpà E&Ey²x¾išÌoß¡›3`qLç/»ú†¹EwF€ÍµÔLÀL 9`ͱuΫ`NtzM$¿ŽŸ?ùÞ÷¦ûšqBd½ôÒÉëÇÏþóéO^ò’tçwNfÐ&¯Á¶U?^¿­è4óµLr¥a¿ŒSºeÒ8® ˜€ t•€XW[fÌv!Î;ïH_pÏ›äñò—¯ÜÛVEJc¶2v'4 °4â «À¿®³HZÿBïófy¬Ø‰$¦–I®4`ËPs\0¡°Z‹©>ù«HŸO·î¦yLç¾Ð™ÄTùžúÝiÖÆAÎ Ïóã¼®¬R\û™€ ˜@× X€u½…lŸ t˜@(š%®³ëp£Ú40VX€µ‚Ù…˜À0 Ì` Ï÷úXî/áV¢¥¸¥0û™€ ˜@ßX€õ­Ål¯ tˆ@(’Rø¢{¥+UQy”Âìg&`}#`Ö·³½&Ð!u¢HBJá‹î•®TEåQ ³Ÿ ˜€ ô€XßZÌöš@‡Ô‰" ©U÷¥*Ö•UŠk?0è: °®·í3¨Eó„—áw¸Qmš ˜@+,ÀZÁìBL`˜êجڒF‹ðgÅËÃV)+ÏÃç&`&Ð`]i Ûa=$°Š(²ëaCÛd0°Û8Rghã!°ª['Ýx躦&`C&`6äÖuÝL aë)Ò.ãV)k™ü×LÀÚ$`Ö&m—e#°Š(R °uWÇL`)`Kárd0H@b*úÍ;&áÏ£äp0¡°z »~&Ð  °á:k0A°tóºr&Ð,¦ØÝ~!iSY:?þèÉf+çÜMÀL A` ÂuÖ&0tEËÔSiØÏs/»ú†ãÇã}‡nš—Üá&`&ÐY`mfÝ' A´Œ¥JÃ~žûòã_+ °§¾ð²ä°yôn&Ðe`]nÛf' 1µŒ™J³ˆ#ßÒ,˜g¿–!î¸&`]$`ÖÅV±M&ÐS˘Kšeþ 2Ÿóì×2´·-L{÷îm«8—3`hDWÁ¶E  FÝâ,˜g¿¶ÕÚ.w}ûö¥óÏ?V‡™À °)>1X†@[L³`žýZ¦u·M`mÒFY`ÃhG×¶B`U¶J:fÁ<ûµ•fv¡ @€}öÙÕ,3a³6^WÚ™€˜û€ ˜ÀÊElË8‰/öË8fÁüŸËsÜ6 ÀvíÚ•ØÏÛŽ9Ò¦i.«£,À:Ú06ˆJ`U6T®×0 º¼lmÙV-,ÀÚ"írLÀ*°eþ ÒØL ,ÀúÐJݲѬ[íakL`ð,ÀßÄ£¬ ¯µ¶ëèÑ£S Nœ8‘Ž;6åç°s0h•€X«¸]X‹Z¼†<ë¬é¡q†aı3L÷310† x XÀýÖìÞ½;±>|xÊD~ Ÿ ôÉh X€¶é]qØ °ípw©Í`–‹ÏPÌšá"Œ8þ/ÈfÛ¢/¹[€õ¥¥l§ „€Ø@ÒÕ˜"°è"|^C×Î,ÀÜLÀZ%à5`­âva-°k ô€Š±Pcº*&Ð`}h%Û¸,þ’±ÎsÄÑK΋ëða°vûºv&Ð9`k´ZßµgÏžÚÜ›·N¬6±GÀlpMê ™@· x X·ÛÇÖ­N€™->7Á;òJ’ÅölãG˜g¿Vç;´”`CkQ×Ç:NÀ¬ã dóÖ"€àºð +±…àÒ†Ÿÿûq-´ƒKlÖr“ò…dþ f‘mïÞ½-[çâL y`Í3v Ý Àý>ÿ*~7,³] `Ör+,"ÀX#ÀS"ÍΆFÀkÀ†Ö¢®ÏJNžLé¹Ï])© ƒ€X‡Ú‘Eœ,ÒD|1]͹ €ØÐZÔõY™ÀÇ>–Òyç­œÜ ûMÀ¬#íÇÏT0óÅ¿(ç?cÑm† l„€ØF0:“¡¸à‚”Jm\%X€-«‰¨ÌriÁ&k¾<ëÕeçÙ%^Ö¥Ö°-Mà^®ÿ€ä¿ ã6YŒÏ+Èš2Áùvœ€Ø(ÎzM.È-Úã¢M  `mPvÛ$pìØ±ê†þ2ß@tÝqGJçž»M3]ö– X€m¡<ëµè.²3,À:Ó6¤!Ìv±œdî ¯k¨ú‘­XËퟌô£¬qj:ûƒ}-7Ž‹k…€×€µ‚Ù…l‘÷ñ…?#ä5`[l©ímÖ2^5æÓÑuçþ EËãâZ!`Ö f²E|nh‘ß…¬>Cá5`[l©ím¶]þ.ÝFGÀltM>º ó¦ƒO ±ñÐo?ü°×€®W쬰ØN&­úpar±Ú™ÀXx ØXZz¼õädÝ› ü ¯œ×€·“¤”,À¶Ðüq¾.R¾æ5_[h Ù: °Ö‘»À.ð°.·N£¶Y€5Š·œ9k»vïÞ]}puÿþý“cD˜?ÂZffß~xèÄ—Óßóùtà#·¦_9xcúÑ˦~ÕÛÒ÷½ôÊôôKÞþå‹~#}óó^QmÿïO½ªò#Œ8Ä%ÍU½­ÊãáǾÒJÛJ˜A€õ`¼é(þ&¤¿6ƒÜðƒ,ÀZnc.B„–þ=™ S‹í™㣬v&з{8½éßH?~ŻӮ^–âìÖ¬ãw½ó] Åýç{öUySÆíÇþ¼/Xl§ T‚‹…øzËÁžó‰ówÀFßK,ÀZîQpQt<Ç-›åâL`!ÿÿÞÿ'ŸJÿ㿟žZ\ÿöç3ýȯ_•.zÛµé‡oN‡oÿLºõþ‡Ò½}1ôdzì«§¿yòïŒcü#Îu·&½ñº›«´Ï~õU‰¼rG™” Øbg]$ Ï ±Ö‹û:áÅ9à“u¿^ÖÅækÍ& °ÖPŸ*HfiŒÙ¯…¿Ó²Ý.nÜnúÔ±ô?\›¾ý¯™Eÿþ%oJ¸6½÷w¥e^"ÀqäIÞøP¢¬(Ȱ›°ÍκD€¥%uo3ð'|â¼l‚bl`[hqþ5Y‹îy:â˜5aSOF[°ËEš@N€õXß»÷ÍSÂ癯:~ûÆO¦ã'¾œGoüœ2)¢ûÞ—^YÛÐ˜Ó IDAT­kÜ` `¦kòŸŽYü©0¯ËèŒëÔlKíÍz/Ä3b\<iVlK&¹X¨|ýoŸL¿uÝ'ÒÓ~áõ‘ó=ÿëÍiß¡›ÒgþËÎPÂlÂ6‰1lþ­ënNÔÁζE€û{݇Xñ¿þúëý°m5N‡ÊµëPc Æü)Š5ÈMyËŸLÿâgÏ,¦ÿ¡W¼5]ó‰»:OâšOÜ~è•o1ê@]ìL`[x«ØÒŒ{ÎñŸ8¯› ãØ–Z™Ì€ÅMŸ¤ÐÌØB¦<¹P4G2YþèžÏWŸ‚ÐLÒs.{gúðŸÝ7+ÉZa‹®[¶ëï¸/ý—ËÞ9b|Þ‚ºÙ™@Ûx£Áš^ÿÉžóo:¼¬í¦éLy`[h ]ñß“ócž–æ:þù¼óR²›‹Êʾô×O¤Ÿë'‚……îðÉ{Ê‘7èÛ”“‰Ô!.Ú§ŽÔÕÎ:EÀkÀ:ÕmcÖ2qf·Xl?ùL(Ÿ0},x—O‹¯O}üãé)OyÊÔ·fr1G¾v&¸íþ‡ÒÿYÈzª¶\ÓLõ NšÕ£®ÔÙΚ"À}}Ç W]aþX™Ñø[€µÜÔ³DÖ¬°f>ð@Jçž›¾ö…/¤[n¹¥Z;ÆÌ_Ò'6ýìÂ7„…Øc¨Þóñ;Ó7?ï••8ùOûÞ‘>÷'†ZÕªnÔ!F©» 4A€‡_­ùÊ„ãùä ‡×€5Ñ ½ÉÓl‹MÅ¢ûÒLØÂ&a¼‚¼øâ‹‹?c„(£;W¿ÿc“Y¡KÞ~XÞƒßSW͆ÁÀÎ6M€`x¹çêA¸´Ÿº'{ ئ›¡7ùY€m±©x Zø•cÉΰì9ÏyNuÁçÑÈŸ€ |íožLÏó5råõ·Œ u–ƒLìL`ÓXS"+0æ5`Ìø-À¶Øæk ° ¾¨y1Û¥5žÂø¯JÖ›ùä¹#Eêø#é¿ú–J||Ç‹~#Ýxô³[µ¬­5`¥JRw Ä`›¾8}?Pöòp_méxòŠK·¼çAP¶±ç¾ÔÔ¯~ÿ¶:á_×ø8pÀßÛrŸìBñ`[l.Ä•gÀÂëGUZ¼ÉñͦÄíÆMàzOú¶Ÿ~u%8ø,ñGÛ:m 0*X Â`£>8îq`—Û–í<ðÕýäN´©d7"lê'yb‚5Ž·)ÀxØ¥M´þ–ã¸é­“z{ Ø-Ýÿ¤`[lC.Ƶž "l‹ÕqÑ$ÀVë•Û‹~ç±pÛL `">°jÃ!Z˜­æ©4ÄCaš)’àÊg‘°užÓC÷Ê"O姺r®0ÊÐŒ¹òæ>E8ç„Göc'þ²Yy²Gd Dp¹+ùE;âÃ#eaƒ6`^ñ©nø‘Ç6˜˜aC݆`ãªN^¦¦ÝÞ¬­&G,ñÚp“.{ ³ææÄM‹‹›B[޲âÍ’rK7"nÈ]rºqËVnæ°Ó+]lÕÍu»É¿í:ÿŸ;?7m~bb>ÛL?U³¦âB3 Ä1”ËuKÔ5Ë9}Qý02óú¤úµÊS| ®UÊ×9ñÔO¥pŽÉS.Š#ì”Ý„¦ó’Ý1¾ì¨BЎæ8ËF\òÆåéˆùU‘¶ðF‘S­ ^V‹f `m´2⋦²Ï7(Ýt² Ù§ñÅMš7'nBÜô8×Ísv†› 妣¸rÜæ ‘º3hh“Mù>·›øøÅÁORžv‘ó<ÿEÒ¬ç–ûLßúü_«د\}Ã:Y"íË®¾¡bõ­Ïÿõ»&ýH×${®WúŽë5¿~¢-%!Ãõ•o>¥~¯G„ʦì!Wêï³3Q„㸧!ìä°;·1.ÈíP:åEZ1#.œp9übýªH[øCýçÞ×¹‡Ÿ{î¬s‘]!`ÖtKð•z.² ¾¸‘ä7$nV<Í-ìÈ|OŸ›b 76ݬÎ/D$­ò#OŽc~ˆ“h?eÎ<Þd5̺!ê&¯'Yâ’wtz½Aœ¢˜Â›1þH8g`Ã~òþìg?[ÙoŠäC<\i ÂŸºÉÙŠ¿lªŸþC€È; a*Ÿ˜¦‰c~¤ú_ýÜk+AqÑÛ®m¢ˆAæ +^G~Ç‹^ÛèŽÓOèôõUõݺ~(à¤Q\übŸTœ¸/å¯Gòã`¯M᥼éׄc?é°_Žk‹ë Ç5íÌíæú!®î+y¸òÔžë‡ë˜ø”?+ìWÚmíáÁý@÷öºWNlò° Š1X€µÑê—_žÒEMJâfÃÅÈMˆ›7«¥oA„½ï}ï›Ü¹ÈÉ[7©IÁ žžÇñfÊWç”A}ôDŠ?çÑͪ—nòº1‘7fìÇq#½Dûxã& –Vܤcùñ©<¯aªGÉnÊ—}ù1çØ!»8‡‹ìŽŒ° £]ÄoÊ=óôâòç¿éš¦ŠX;ß®¬Ë+3DØ3_u ÚÈyÞÉ”~¡~Èu4«ŸÄ¸¤ý³d`©_Çë‘kB×nž¾”7ñ¹Æêœîkñš$nn7~ÄQ^ùµ™çO<•Í^®”o¬Ÿâµ½×}L÷Úóxÿªìò°¶›§3åY€µÕ/yJ—^šyä‘ài¸@ãÍe®i…×\øÜ¬4\èùpnž)U¢B‚†øä¥A„\«»á“&nÄÕnòñ¦Z¨épùÍ–ºËV£Cq”ãXõ,ÙM¼h_<& .šÐÀš§QYuù+|Sû_zÇu•€øþ—íO_ÿÛî~㪫 f°C„ÁrÓŽ>`ú$çºè±Os=ÓOÕßcŸÃ¶¼Oæö–ú]ÌŸò¹ž(§ë›óRÞòÓµŒmQÀqý‘_¼É7^Ó²‘kG÷;ÒÅëQv(.{8‘qå”NöcK¬Ÿâµ½/Ý·°Aí9aæ5`m7M§Ê«I;efÏa¦êô°[o½uÇÍIµãæ–߸¶c__ŠC>ÜܸrÓâf¶ŒÓM[$¾d—nÀuùÍ»áçéJùQ–$öºñâϬüf«7s º9S6þð`Sð/Ù´/F䇃·ÄXðºü«ÄúóŽ›n¯„âá¶ûÞP®ÍdÓUFmaC6˜nÚÑOè·çœsN%^b§,=(ð¯ßõ]ß5¹»÷Þ{«>Gz~‚Œû ÇlÄ'OŽuý”„áôQ9]c¤ÿøÉ,.ù“_tÏ~ö³§î'ØC~r'Ož¬Î£H"Œ:^qÅŠVío¼ñƪ~ò$œú’×áÑñk„Çë™ðœ'×}¬_Ì£­c˜ª ò2ñ÷wÀr*ãzÛºÙ>= Ås£j底ãÞгóÏ\}ºï¾ûNÕàäÉôµO:}ÿ÷íùÖë'Ö-ï¹Ïëá,/zJ z XŽgTç`m4w¶ŒÁ‘ç™üôJl!³‚㧈HÏ@¿T…‚¢¨Á6Í$)*7Ê‘C éQCüèb~ÑŸãyL72‰IÍp!8qyÞ„Ã6Ž£ #?ü°1>Iç‰xøWe³'ϘN3 ùÍ–sÂpä•3¬6øç¿ýæÕ•`¸ä*xwSXa‰ƒíÆë}˜½F|ñú‰¤éÑù_íÚ•î½úêtäÚkÓ­ßùésßôMéñ›o®êsǹç¦{¾ñÓcùHwêîÆq~F\óÜw¸7rÓ¦:s/ùúÿpJ‡ÍÏÔ1GÀ¬­&=½LÅ!T4ÃÅÊ`vÅ›¹Ï^CrQ#êüÙ¸Ø*Ëæ‹]1Lû“§fÀ°!Â9b„×”£2{ì±I˜D™Äâ³W~¼æà<º8†¿^ÉW"Ê—0ʧÞr¯xÅ+&Â?ìEŒƒÂæèÈ3ÚGý¹yÞ}÷Ý1ZBèOù=ðÀÕy´‰0¢\ìS}Tç© 7pò®?ú³J(üë¿.}ùñ¯m Gg¯<þµôo^üºŠ-Œ7â^,GÐÂkŸ7Ëc#¶|&ºŸp¯¨Ûx yä©OM×ý×ÿº|N1Ó#ß ªÔÁJðÖÂwÀb͈:ĆÄB ¯=f@ˆ®gç~îséškÎü÷ßß?öXzÖ³ž5™ÅÊÏõI•Û®ï¤àÕ\/fj~ï7ü¡ßÕLZ(U—׀ŠÀ¶·ô1^=Éù¼Yâܵ=ÐþX×Z¥U{,ÀšÆÍ͵ð0fW⓳%š[Ȥðúq¡ø‹FºôÒ3_ìçÕ)‹p¹Qàzpþ7ßò-éØûÞ—Þö¶·¥;Ÿ÷¼ôçz%’R:~ñÅéÁôÒCמþ6VêÃò®á.y{¯ÉÖ°gѤ}`Ôgòz÷í~½»hû:Þ‚¼lAPÃŒfÖF»fkÀxÅÆ«5f§Ø˜²æµ×R³UA„éÕXu:^*O#³u|·ŒÍçÍòX£ÿÝ÷çV³3ÌÐÜsü‘5rj?iŸlaÌs;X„€–ƒè>÷SKô:z‘LgP,ÀÚjΆ¿ÆZ%‰9íYç×g-\UD¢QÎçÍòç%÷¿pÕ‡*Qpñ-™ÒÑ—%cÌíL`­£E„é~÷¬û­œ¿6å Ã-ÀÚhÞ°¬ï€Å*ñjsr±Ç÷šÀ±Gó¬L‹-gaog³0Ã…øšé¼l&ž1Z€5ÝÊÌ…5`ˆ!¦¢õ_ƒ±x.Øü¿óbøÔqxý8åŸð$f–AÀ©¾xÿâ·~pµéG`Í,Ø/z-X?l‹V²¼„u¾s×€ÍE4ä`m´n¶ ‘ÅÌOILKóߊøÅoN-d–fÖyv£!ð¥¯>1™ýº÷¡/ö²Þ}Z&À°ÖZ°/}õqy{oE¬ó]諼¬Èo ž`mµrö0Ä"L 3yZâÓv&0ÀïþáŸVBàÇ.?ó›xóÒt-¼ †0G„Ñv&0‹Õº¿çûÉ"|¯›…pða`m4±fªØÛ™Àšžùª•xß-Ó‰]3ÛV’óšß¾ 0˜#Àh;¨# Eøìãâ{?üðç>ïãï€Õ!…¿XÓÍœ­kº¸˜?3j¥µf1Îï~ð éeWßÐ˪c;`× /kÌ~ú 3²ú5ö<Íob-!³¾ ­Y°vÌ,LfL³n4ØÓ´ÅØ]Ÿ¯¥&ÛŽ>9w>x X“ÍÐù¼-ÀÚh¢°Œ' |::žoòçjÈ‹òì¦ HÄ0ˆöMˆýï÷üa5ø7µ‘…àâôôÎŒ ÿMˆ°éÖ8õ{ž«Š¨m0ØÓwh‹±»>_KM¶‹ð¹†r^¶¦!F²k«UO¯{â‰'ŠSÒúÙ M®³+7n4Hû$ľï¥WVö6µ‰~ˆ¨É…çM‰uò]'m¹wÌ÷Õ<Úbì®Ï×RÓmǬñÜEø^Öt3t: °6šgÁ5`\° €ë8¦½^lšÉàx“Ânû楕 ÚÖ¾Ë3b?ö•J|ó‚×Ìør83Q%F†Ì¦J˜•„¯ñÏûýPýZ}“5`*‹4ÚâL˜fVúGÂHÃF9œ3óÛ°2š„´}”6éªÛÖ5¤r»|-ÑOšt¥¾­~Ìžâ®~âÍkÀšl†ÎçÝl/ì|õ[0p‰5` 8 Pë8-ôd bàã¼/kÁtóÞÆþ©/¼,í;tS:þh7?ëñžßY ú?vÅ»×é"3Ój¦‹WŽ<½Kpå‰Cù+  (¢è{ 8DQ€‘·ÂyøàXååþœSe(6‘7~ØC®!ÎsÛrû×=ÿñ+Þ]µmÒU·kHevýZ¢ß4éÔ·é“¥mÒ‡½¬Éfè|ÞÍöÂÎW¿%ðY%2ˆ¬+ÀbþäÅÅo7M mÒõÁBÖëC W^‹¼ÙÓg0 Rl#ª&ƒFJ•8#Lž4œ3Åçˆ9¹(ÀäGº(Úð'^Ì?Ê"®fÓðãœë&:Í>D¿M_yýŸTlìÂíëµD¿éŒó°Î4EÛ†t¨¶]õ–Ë;½ìøñãÕ Á  ´ñ¿)Çà§™‡Må9„|4hôEx‰ùÓ/yC5èßÕÒß!¸;ú*3KꟄá§5.ô5ÍBá/a†ˆ"LNLç쉟 °’_L£ãR¼6˜úm2f'}»–š~0%úaÝ6)ßkÀÆ|ù¤Ñ °­’°ìÁ,^” lq†aÔ½²áÊóŠ±Ë¯KÕÿÒ_Ÿúúý9?ÓÜú¯R¹òãºa&+Îf!®xuˆãX3S5„™f¬&ƒÍé™-DXt%Uò‹it\Š×†£|Ú‚Wn´ÍX]¯¥6ÚJ}þ™o\+×_½×€µÑ/£³Œ8OÔÜÌÕ¹ùk­È*\y'¯øD>/]Hq™—f*|‰5`Sé|2—À7<õ»SÝ67qÏ"ÜzÿCÕ`ÿƒ—þN£–smÔ]ºd‚‹ëS³az€àºå:å&<º¡Ì€Q'ÚFÛôÝå:Úv;1Ž À&®5`ºNÙÏrØÂx˜?ÍJã°Íèœã©™!ÑEgÕM&ÿºAb ÒëI}V\…©3¯,ÀÈ([ÆlõÒÂìuÔ¹Êö~6ºAÿ¡¹ƒGŽVƒý ö¿¿Ñªé¡G¯caôÑ(¨èÇ\O\‹qfL ¦2å£k9~ Ÿ<ò¾Ïõ15P…5`1n)-áø7íh mÓwWw-õ½^]´Ÿk€kdâ6¼Lý?^'“²ÂX€±¥ÃæïRKVŒ›.7Oöz¢ŽYÐi4+6¯ƒÅt««3¯%À(<ü$ö“/õÓì±eÄáªuJ: úÏ+öòJUWüþ©°¾ö$¯Föˆ*ú'‚оH¿g°`ÐàºÌû'ñˆˆôêÿ©&¼‚ŒŒ<ÈŸ²tÍsLyZWƹġâ€8ù}@×l#€B¦´}޶é»Óu£kIç}¯Wí§¯OúlkÀÔÿ'eÔ@Ð5†=vÛ!Ð)ÆÍZâ«ô.Dê8Üà›vêÌ”¹² kÀn½õÖ©'{òד¾fÂV.gd 5Hhвû‰7¼§ìÿà“÷4Þʈ0f®¸¾¸Ù¸Ik~4áEx¦©ü:&¶(À¸¶aä òT>„!À°-º< aºfc¼&Ži úmÓw—_K:ï{½¶e? ôë|cŒãºjr ˜ú¼–J°ëǬD§¿N 0Ýló›y 'ÞÕ¡èxøsæƒá›Õ1ó›½òVåQ²e¦_¶Œ|b‡§ÎºPò°™ù:p2Û5öíÔpò³ÇÝò!@[Ð÷h›¾; .]K:ï{½¶e¿Æ ÆŸ|‹³ÅMü¤ÊÖ¸RÇ€ñf–cLÔJ<’wã ´òV™uãd]9”Áx(F*#pS9XéÙ4¯žJÛÅ}g˜^[uU;OlRä©N’7˜fÞˆO#\¯;Ôë:ÖB¶†5`Ô“rˆ²—c¶(ÆÊwä‘4HhÐ`/¿¡¡ù_ùíj°¿çø#C«ZoëC[Ðçh›¾;]7º–tÞ÷zõÂþ®c©c1c‚Qc¢ü¯¢ÓØZ7N’.N<ñ…?¢‹ôlŒ¿òËE˜fÛc|‰·<ïh[—WW;®•ÄÈ: • 8õ”qÚVuörD¤É;•„auKùÌ݇5`êHäK‡ÃQo¶¼ÓÍÍwÄ4Hhвûî_<õ °ÿ²›_éc7¤-ès´Mß]~-é¼ïõê’ýz-9eSƒkÀ*WJ{Í$v26‘>4&’6:­uã$ùååpŽ^†òŠëM5¶çy`ƒD¶õÍõF€—†É·Øàj¤¼s¨QÔ°ìåÔ¡$„䯽ÄR,Ga ïÃ0¥Ñ¬—ν_ž€‰1°ïø¹×Vƒýcõøò :˜"®ë y ™t⯯ڄ¶é»Ë¯%÷½^Û´_c6hœApLƧ;îH©ß‚Ô8GY‹l¹¨‘ÝQEŽnqÂBeÖ“Ø‘—#– ' ùżd³f¹“`ämUß\o˜+ïPQLI€å ­FQ'‰iJ~ŠÏ^á±3Äð¹ÇÙ°¹ñ7ŽF2¤c ±N%¿Þ÷ã¯?ùä†{Èv²‚£-èOÿô'_Ùûk,¿nòó¾_7|±¿MÇxÁë; ŽK˜íAÀÈ¿‹kÀ4ÖÖyÙËɯ.MI€‰a̶!²à’ψQ†l"eå›ò=}ÙWŒ›¡¶h¸üò›eþ@—¸Z$58û?6tô§^Jýå—ç#uþ„Ç|¿èz XŒÏYªo1þÌüO–â#À¢¼‘ÑŸcˆõ¢Ýb½VíÅþ9£ÿ4ŸºÈõµ^`Ñþ¡\_C»Ž¢‹í¥>ØT?'_„÷úX.ãŠ\ô—ûuü)Oe¬“O=uùGË%¾Æ¶èÏì¢ ýñ“‹þä£-÷gLÅEåÑUÿÎÌ€ˆFîäé ÒËŽõÞ7ÆUGWCgI&L“pŽ)3úÅt +†/||z ØÉ“''å‘g¾ÅiÝ…óžÑ3`¯èýìDÔûêxöfF7ßJ¯ƒi›oûéW÷¾å3^ùyìƒ}<Ž¬Î¸!Á>ŽIœOÆ›×€Mʨ©pÝx‰­Œ‰ucžÆÄ˜¿üêÒ_dP2 1ÆkO逘¿l*ÍŽ•òê‹_§˜Þ“Ó³@ÓP¨]¶¯®C©1ÔIbê̶րñ0:£ÝúJƒ„üÖϽ[9Lá?êEø]i/ÂïJKtϤŸ[ìg«Øs~ß}÷5ö[¥q®D¨n¼ÄfÆ(l-¹Ò—Tf) õ. 0Ò”âkMWl²)N¸DÛÈ‹­o®sJ@ üØÓ¹£Ó(N¼®C)âÓb::þùì6ò^ÉekÀÔ¹VÊˉ¦HlÅ'rùMEÀÉ™ÏP|qµFüŠa´cSµ@, "4Þ0†0¹0%::ø[ŒƒŒy¥‰±„E§±2_O^¯£ "-ã.[œDÁ_åǼ4n’W_6ÅøÑ¶.wN€WÓt€sΦ†ÄEœ;5DÞЊW`„Åož0F<Ê¢s”Ô¾ò[x¾Fl×E¹pޏƒ€ÄÖض>Īkfü5=X§±IÇ=¡íkÊbÝd Ž8¯~L×=BKã•–ý0.æ“q"#ŽÙ\—J—˱ ޵Q&éÏ£“È#\qÉ{JñcÚ®wN€ °?‚ `ÀǸ<ÝÖ=)+ù‡'^f¾ãÓ3¯D4¸ám l%›”_{Ú‚×ß´MW¯¥í´ }‘~›¯WÚaMkÀv”aÎè†C¤œw^ª>J§)Ù.Ÿ/#Àhú°LÓÒ B¥Ád¬ŽÁâ‚×¼½ÔØÛ!pëýU\~ðÒß9ãÙ â†Á„ÙYú¬ÖLFÁ£5 ˆ.õk¥³ºšЫ ÒqL±ïk£\ކø".6PygŒ¶@€Ñ6]s¾–¶Û"ôYúêBnÃkÀ*Ó‘:A  a7]?_¶ùN¯;~üx5X0`”¶ø¤¿l} -¨·›nÍ/ýõÕ`Îϼf: á3‰( ‡hbJN¢,â_4^. Jå’7ñò !–§—]Mîi ú+mÓçk©-ÁõƒÁ\§ ‡¹aˆº#À†HWu kÀä•ï¹`_ù–ÇÒyi°kkÿ²«oè Ò§_rê¹Ûü¨¤„PI‚K r黥‡^!"ŽrÇ"|ü4[– ¨R¹Zìs—§ÏÃ7}~׃_¨ÄmÒçk© ­pÆ® >ØÔÇãþá‡ö°3¸F{dÖtÓ/±Œ'ûüé~óØú ä®»ý3I¢¢-Á•—Ó'öâ·~°ô¯¼þOVé+¥) !2ÊÅPËãÑ/”`¼®$ç¹€*•›ç+”§aM_yý-U[Ð&]p¾–k…ÒCÂb)—‹¥þK¿,m„WÎkÀ–;°Ø`m4hX6«8ýKî¬8‹„q“a°ê‹+ ~¹³õÞóñ;«Aÿǯx÷ÎÀ†|4äÙ¯:†ØâÕeþŠ\@•Êí’û±+Þ]µmÒ%çkivkÐÏ:缬sMÒ–AìmU½årN¯{â‰'ŠSÒˆ/f Öu}`ªo<,ÀDñà˜e IDATåÌþáǾR úç¼ ½u`BùŒ*},®q‘ ËãIp©¤c‹ŽÛEy/Ÿ%.¥ù7qL0›J›tÑùZšnÄ{ð:ŸŽµ…3¯ÛôîiÖF[„5`ú-H’|C€åØ*æõU€©® ?÷»Щ÷À÷½ôÊjàÿÝ?üÓàÛÜ!Œ+ú& \eˆ.9ú­âipS¼ø_dʫVùkOz®ʦœºôŠßÄöˆ/Ú¢ëÎ×Ò©’ð§ïè8Øt[rM¨¿S.×ç“{<ŸZ:÷ÜMëüzDÀ¬éÆZp OñÌ(L.Φírþ½$ð¿ßó‡Õàÿ‹o?ÜŠý!*“>÷ÀÿÜ-ò0úwüVǤc€ŠyÖ 0 jÄgÓW°óô¹m›<‡=Œ¶°ëúIŽ~ª5ŽôexhàZšzÐö°6š£³e´Ó;[ý– [p hþz¥% ]LOð þ»^xYO,.›™¯+Çê¦/ìiƒ6ÿµ›$úgU[Œ™Y„VÉág…“×€•0ÂϬ­f>½lVqÌ24=->«|‡õƒÀ3_u ï»åî~\°²¯ æˆ/ÚÀ®˜‰jÃ1ëgtc™Sa^ÑŒîØ¬&kÀNž^‰„À½}±ÿêI ` s¶/}µ;_¿ï ¾î›Éz¬ 9îãZt¯‡löZ”?¹Ï{ ؆ˆ÷3 °6ÚmÁ5`m˜â2†A@ Á»ò!ÐaP] }÷—ÞqÝìˆí' ‹!þ±Šõ^ña›sü§œ×€MáÓ‰X[­½À°¶Lq9ý'pì‘Ç&³1÷ýù£ý¯PÇkcÍ~Á~ŽÿÍ×ñ:+ð:Þ†}ueb³ìb¯Ùþ\ˆÆ,ѲNoæ¥ËÙãó[Ä¢ :f»°q2ëóö°HctÇ`-4ù­ï}oºåÿãtËÁƒéœsΙºÅÇ^„ßBƒ ¤ˆ_¸êC•(¸øÀ‡zW£¾­ƒ1 æÛr%¡Áýb!aÑÑ”=õ}…rˆïk/übQ„5-ÀXc‹ˆ­u,A!Â6ä`#QÉžµa!æï€mˆr³±kºíNžLO~çw¦Çï¹'ñV.B>5ÁT4ÇÚ¸!§§›¶Ïù÷–@œ•¹çø#½ªGŸl5ûµ‰ÙF®Ä‚ ¿æ$qVKîä>Ö¸_àf 0¥APVé/ÿ¾[Dä­ìÙpÊ‹sê@øí·ß^åÅ ùP&.`•gJÕz(募…ã˜uQ~„ë[røañç9ÄO~ßÕý·J»áW”# T±Ãâ6üÚs’¯zA`~¯íE5:ndXÆÍƒ‹ròLçf«‹5x÷æÛ¹¡Éiàæ7 Š·í=ƒ@´O˦íMæ{Éé‚þ·ß¼z“Ù6žWŸl`°^×iÖõŸÿ·‚B×qè›ÄÁ•úኟۦøqº÷ ºpú½Dûxo"oÎÉGñc¸Äa¢h¢HçìÉ+w²OþØ¢²ÈOõ&œ:§ŽõKÔ‰0ÒÎsñÏ«´Cy;Ë6쥧îó~*Ëûî˜ßk»_‡~Xxz ØñãÇ‹7#*Áͧt£êGw>ç7ضëÁ€ÂzžË1ìf ‰À¼< o‚Ç—ÿZú×/~]%~ïïXÄ ÇY‚L_ÿæÅ¯K°^×!z$xÈ‹Xâ—Ê)õún.&t©‹/a”‹?ÊÔ Çùuíu,Š1Ò"24ƒµŠƒKœ)¢\q£¾ÔM®TO…-½ßÐ0ê,ι Sa^–ãÕ¹X;vï½÷V7LÝLbñ\˜‹†˜fÓÇØÅ(7==uªlÄŸ› qô4ÄŸwc$/ÒQ†òÄO.>ÝR^´Eys£&-çÄ'?Ù}øçƒù3øðäŒËš’_©Þ”‡]hHGy”‹#œö+ìçxÓî]ôg‘ð• ˆ„MÛ××ü\/Œ7ḾèôQöqöF}º®œRx©ï*ý¼øêÓä¡kI×`)ol&aôóxÓ9~„Ë‘_<—n×~r”õÅõÅX/ÏGéó=öq Æ2¦âlp XIܪ,Xø;`¢1îýæGƒqóÜYûì;`DàäæÂÍ€›“nPùegfÍûp“ÒÌ‚sݰ;œKppc¤rÔK7oüæÝ‰KUžâS.ŽÁ‰¾ÇÊ_q‰ã+œ4Ü´±‡ª‡Ât^²;ÆŸUol’ýä‹=вûØ8§¾M¸Ék²«ÖMÖ„}}Ìó’«Nýæã&_ïÆ> õcŽ.³úGŒ+žyß•ž·üc|úm¼¾Gû?ìãú¯sô{mºîˆË5I^¹ãzˆþùýplÔ^éóx%.Š÷ÄÃ>î \ßäË=L÷Mþ$yR|)WçøOÊÜàkÏXW÷ƒ@3£A?êÞž•a ˜ ÕM‰› 75]¨ ßÖž…nì¹YIÔ`£ŽKöå7lò¢~ù†?N b^ñæEq¸Yꆭ¼cZn¨Ñ¾(À¸ñŽC@Æ„ ·Ýÿð&²l,. 0ØI|Át“Ž>Jߤo<ç9Ï©ú¢ú4åNÃï)OyJ%.Ô §OFœâ*>{6Ü-·Ü29®< ‚>+{øDN¼.°/žßxãá£ü¢@Äþ¯Å!h× éî¾{ú·L¯¸âŠ*^,ÛTWåüàC8BJuVœº=÷Íü‘†|8Ÿ¸ ­›äwZ$ríÇvœ„{ ØÅ,ÀÚhõ°lVq\¤ùÍfVüM‡qóƒü±G7Äüf›—ã6Opo^_nФÃa 6•\)o싯>òt Iñ‰:·›tÄU^óêÍ€³ÉW%¹ÝËœó•vÄÃ÷¿lúúß>¹LÒVãvU€Á v0lü‹÷,Oˆ®ãç'î¿?ýò/ÿò‹Ož¬Î%`ž|ôÑô¬g=ëÌ5Û±ú ÖØ¸^¹ìDØ»áï€U8b\à[`v£%`ÖtÓsQŸ{nJ\l§O±ˆ ÄFÝ&Ñ£4mì5Q€q“â\¶hÊ^âq„ýrÜØâ¬SI$).ûyŒ¼âÓ47zÍ0•ò–Ÿ˜r³Õà@yØOú\ô•e#¼”޼êê ò…•âÛ•7{Î#¯*óþ<óU*ñü7]Ó@îÃÎfˆ¯g¾êm›¯è¥—žp8u_Ð܃ó¿ûwÿ.ýß?øƒôú׿>Ýö¢¥Ï}Ó7¥‡®½¶âôÀË_žîùÆoœœ§.Ô'û *×"×{î ñZ­*Ñà«@î=ñÞ¸ùÎåûHàÌèÙGëûbsX&Ñ Á7 üvÜZª+7 nR^¹8A4FD "MŽºáG˜êÅq¾IÐÍ`Q´¶PŽüñ‹¤püÅZqÈ4šÙ’^Gü%>gV½‰C½É':ÊÃ2 §ÜÜæSÇŸyø/Ów¼èµ•¸èm§ÈMå=ä|`…øúW?÷ÚÃ;ÆÎ;/%„ØEz(óys<ò¸Ó ʽƒû÷ ®Ë‰0Úð°ØJ÷ºîãq˜ÁÆÉ Zà;`퀬/åG~äG¦Øý÷ß_‰E¥ÈÏå?Äý-÷=˜¾õù¿V Š—]}ë¸Ñ:ýÊÕ7T¬`»Æ¢€{ÄÏ›åQÓa0('®5`äm6!ìƒ@À,Àhì0¬;yòä”Hˆe2cgpbX+ÇzBaóD(׃ó¯|àég~ægÒþè¦{¯¾:Ý÷Û¿]¸Ïþþï§»Þð†ô‘|äTºP Âb¼áýÿ¹ós•¨`Vgß¡›6œûzÙui l`Ä3»a`š×.Í|!Ä&Žë±¡5``Ê>,ÀŒF¹¨Ã0D}Ý&–¿&kĶ#Òd™]È›ºJ|ÁÀn\¸×–ÜÄ¿Á5`¥rígåi.›%Ö€‘1O@LC³×T5b ?=mÖçfÓÞóñ;Ó7?ï•• ùOûÞ‘>÷á5ÌtÔFÎÚ\Fݨ#â‹:Sw»ñàAwêuãéŸ Â¿r-­y׏ހX™MûŸ^Æg(xâ* -fÁØìL  ·ÝÿPú/yÓdV¨ÍOU´%Àâ'&þýKÞ”¨³Ý8 Ä]³^‹ÏRð Ìñ½÷Þ›ÒkÀrªä˽¾´y~Nkœç`m´{Xvë­·žYs•ÍM€™0;h‹À—þú‰ôóoýàD„!Rþà“ÍÿG`ÓŒ:P½r¤ŽÔÕn¼JBH~ü°÷ï½éMk­‹dõKì~ °¦Û9[Æ:/^5–*§ ´Màîùüä³ ˆ–ÿrÙ;ÓõwÜ×¶k—÷á?»/=ç²wN„Ÿš nv&0—KE²ßœ›¦&‚––œ?XómVndÞ`m4x¶Œ"´¸0qˆ2þƒa[± Ó\† Do¹ñ“é_üìeóC¯|kºæwÇ(<¾æw¥zÅ['vSêbgÛ €ã$ŽugÜóå¢8“Ÿ÷ã$`ÖV»‡ï€qAê? 5Žøò·aÚj —3‹À×ÿöÉô[×Ýœžö ¯Ÿšïù_o®~Ψ‘©žeÌŒ0la¶éU㹿ðúô[×}"Q;ؽéàšû=÷wý—;ß^¶­–éV¹`m´GX‹cšY0Í„Å0›@\õÑÛÒ÷¾ôʉÀAè<óUÒoßøÉtüÄ—W6qÕ5`”IÙØ ÑÅþ{÷¾9a« t…€ásGpŇm¿‚ìJ+m× °¦ùgkÀš.Îù›@núÔ±ô?\›¾ý¯™>,t¿øÀ‡Ò{?qWzø±¯,\ô¢Œ<Éûâ×N-ªGta 6a› t€ä[|u½¥Ú³Ï¬ Öa OCz*íý_m4ˆËX•ÀßÿÃ?$~´ú¼ñ÷ÓS_xf­˜f£þíÏÿfzö«¯J½íÚôÆënN×Ýþ™tëý¥{úb:þèÉôØWOóäß%ÇøFœÃ·&½ñðÍUÚùõ«y)_í)“²±[ìL ‹f½Ù˜ÖźئæX€5Çv:çÓkÀžxâ‰ÉkG]ˆìõ­˜Nì3è&ÛýyzÓ‡?‘~üŠw§¾gßÁ$á´ê~מ˪¼)ãöcw‚­2ŒÀ¬…ö¼šô° ØHO-ÀÚhøš5`yÑ|#!fg}%À+Ã?¾çóÕz¬_9xcúÑËVŸ·ø¾—^™ž~ÉÒ?ûÿ~=ýÓŸ|eµýËýFåGŸ‹ .i|äÖ*‡ÖXcÖW~¶»ßx½ˆ¸âM›„˜öÜãýWýnãMZo¶I𥼖XÆ¿‚,A´ßPÄ™°¡ÔÉõ0à ÷p~ÞˆMB,îý-ZÞ[€µÑ°YÅñïÉ`³9¬ï$À]„ß÷úÚþqÐŒ×8kïZ/JÀlQRëÆ;½ìøñã3áûC¬ë‚vú.°ërëØ¶&0+Æ:_¯ïm‚n¿ó´k£ý°|pǺž–^þ÷ä6Ãel“€Ø6é»ì6 ¸x ÿÛs ±6[¡ÛeY€5Ý>K¬kÚçoÛ& ÆÞΆJ€‡iÛópÍìáÅ9þ~ØjË/W/ °åx­{Á5`«eîT&Ð`ýi+[º:Ú³¦·äð÷Bü™ñùY€µÕæ¤tèP[¥¹è$ °N6‹Ú0Y‹ðg…mØ g×q`h ¦£5MÝsl‚ 4F@ÌÿÙbgܬ֕Laáv&`¶¥>€èÒGùâ"ÍÝ»wûâÜR›¸Øæ X€5ÏØ%tƒ÷rÄ–f¼ØsŽ¿ @Àl ý€Å˜,Ääbäg)øHfÀ´nA†8³3¡°Z‹º>"À=<Îl8q¢º¿#¸¸§³ç~¿ @Àl ý€­r1Ö]ˆ\Ä\°~-¹…Æq‘cogC"À —?¤=¤m¾.`Í3ž*Wˆ«yÿ†Ì ˜gÁ¦Ðùd,ÀЈ®B‘€X‹=g°›§‰ fµ`óœ/æy„ÞG`}l5Û¼­ñb?oóÛEˆ?Î|%0|­ÖЬUÜ.¬c$Àü_k›³6Dk{ão×ǵbkì zKÀl M·Èú..\.h; °!µ¦ë p¿ö°HÄÇóX€Í#Ô@8ÿ ÓOAùZ0þC’/%ž‡5`г4V X€µŠÛ…µHÀ¬EØ)ÊlK ‰c&,Ÿåâ ŠÏSø[·Ô0.¶Q`ìíL`Hx æ¾ng‹°[”Tñø E>Ë%áÅZ1¯hº³Ü* °­âwá&`"`֡ƈ¦x:;ÒðñPX€ ¥%]0u X€­K°¡ô` u¶[% æÿ‚Üj3¸p0°k¹x券š·éß—[6ÏÅ™@£,ÀÅëÌMÀzDÀ¬åÆb—ÄÕ¬= ñ ·3!°Rkº.&`ë°[‡^ƒiý ²A¸Îzk$ÀØÛ™€ ˜À˜ X€u´õ-À:Ú06k-`kásb0°ëhcú›2m›µ °µð9± ˜À€X€ ¨1]h›ÀÇ?ý@ºûÁ/,\¬Ø*ÿ©´ æˆ&`&Ða`n›f]'pÁkÞžžñ«oYØL‰( °…‘9¢ ˜À@ X€ ´a]-hš³_T‹Î‚)¾XÓ­ãüMÀºNÀ¬ë-dûL £˜ý’ ZtLñÙ/ë”vÙtŽo&`]$`ÖÅV±M&ÐqqöKÂh‘Y0ŵëxÛ<0Æ X€5ŽØ˜ÀðÄÙ/‰ªEfÁ×lx}Â52XŽ€Ør¼ÛFO 4û%a5oLñ¼lôÝÈL`ô,ÀFß À–#°ïÐM‰°8 ¦ó—]}ÃÌÌ,Àfâq  ˜ÀˆX€¨±]UØ4 ªEóU|Ï€-JÌñLÀ†JÀl¨-ëz™@ $¨-JñÙ/ë”vÙtŽo&`]$`ÖÅV±M&ÐËŠ"Å·ëIÛL0ÆX€5†Ö›Àð HPå5ý†§~wZgËóã¼®¬R\û™€ ˜@× X€u½…lŸ t˜@(š'¾X6+N©Êue•âÚÏLÀºNÀ¬ë-dûL ÃêD‘Ä•Âó=,÷ã\éJUVüR˜ýLÀL o,ÀúÖb¶×:D NIH)<ß[€u¨mŠ ˜ÀVX€m» 5a°Êk3O€)]¾Wºè0eE‘âûKønT›f&Ð  °V0»®8xð`:räÈÄ<ŽÏ:ë¬Û¾}û&qºpÛ¸{÷î”ÛÈùù矿’¹¤Ëó+e$AU +ù)¾X‰ŽýLÀÆDÀlL­íºî °[ò8zôhºð 疆“pü±‘ãèöïß?X¥AïØ±cU¹¤ÇÉVޱ#Š3ü(Wâ‚=å‘/ñJ3jU¦ÙÍheÞµ§ŠÏ~Y§´Ë¦['~d¨|JìÖô~QNÛÆ~IŸ Ïч6í¶ÉcÓuq~&Ð& °6i»¬F 4° h$b(LÂq‚CØ0É•*”:Ç F¸Êc`ãœrqˆ—8ƒÅ±BÅ%NŒ¯pÒ#|$Š$Òd aWuƒ^¬ùrŽcàŽõ–XÃ+oöÄvɆ|¿¬(Rü6u¤¨ÇâO}$vaëMýñÓ&>uìÉKÌëºâPùÐ>Ñüè[ôaò"Œ8Ë ôØÔf¹ùËÊÓƒI샤ÅâéRÝÄj•í½ ˜ÀNõ#Íθö1N``Ô Æž„ÁPÉø|P"/”|Óà«6æ %Å%ƒeà”wL‹“­øÇÁ/ÎZ1ø1HÊÅ2åÇ>Ö'·5² ò°Áåñò|ªH5$¨j‚wx+~›l–(ÎÅ'ç´!‚WbSÇ^ñ ¯èz P%žúéIKØ™Õ?ò¾F:õ½ØÈÿ_v¨œø`ûi‰KÞ:¦)qgñ¨ù ˜@‘€X‹=ûD€A’‚AÑÂ.ˆòzåá%‘ÓÌ5€’/vá‡+åÍ@¯4Øýrœ3ЩNœ× z±>¹­äÁ€ŽÃ.ÍxäñùT jþHPÕïðVü6áÃX‚ƒ`@ýp0Ññcg0øÇMmSbÛ* @ˆ.ãâ7K€ÍèÔ)ÚDZڛ|s;T>{X_"‘¸p•úEnsÌËÇ&`õÎ\ùõqb% Wk,04³š<.ç%‘+?o€³'1]]ÞØ§WŽy|Î%”ØGQô4pR\n+áØ§½ÊËãá*^i/AU +ù)þ¢ìî¿´)­Î?z²TÄ?„ü¨“ÄǸRÝc¥ð{¥™ŸrÚìµÅüâ1y®*ÐÉ[ä4Ã¥ë$W<íÕ/%g¥ËmVÞ›€ Ì&`6›C;N±¨Ð¡FƒOþªEšªÅ€gÖ`qV‚2˜9`ðÇ•ò–ƒƒ³fH£×? ˜Ñ僞Dõ‘‹eË•¼b< 7ØàÄT •¶´—(*…•üQö²«o˜ü‘Òj¿ïÐM¥"vøÅWoF‘£œmÌ Æ•Î^þyÞòñáÛWq´qñ“Rx¾¯è%E\‰}òÕ¾ÄSÙìåJùæ6+®÷&`³ X€ÍæãÐ@ô00ÐjÀŒƒ Ç„ƒX‘Ctà§A$Dø³)?å¯ôì•–c„ âFé°¢°Á?:E…ãÏqŒ£ œJ«üµ'Ù¨8+ÕM~äCêþb„ýly~1¾Ž%†t>o¯øìq_~ükEöÔ^–‹õ…/¬$º$>ÅÞ0Ó9\ˆ]Ì/ús<¯H(ëAí­óÄ•S:Ù‹-¹ÍŠë½ ˜ÀlÓ£Áì¸5Ø0sÎ9gJ€Ý}÷ÝÕÀ§bòsùwe/Aµ¨=Š¿¨#ßÒ,Ø¢³_¤G4Dq‰‰‚Q$¡J¼(<ÄEdÈ_b(î•ß<†=Ä‘=”r1³ª@ÇÙ«¶¡Ê•›eqáÄ—ØRºü%XÇ{0ù,Àæ3rŒ.8Ö=ð@J=;ÿ«ãÇÓ3žñŒôìg?;ÝõÁ¦ÏÝzkBtá>ýá§{n¾9½ï}ï;Õ]¨_Ö$¨2ïÚSÅ_F€å³`ËÌ~ÕÒ“„ ³Sr_ýêW§DT~®xÞ›€ tŸ€X÷ÛÈÎ"pî¹§Dâä¼óRòy³<²¶ Ê¼kOÑ5`Ê(΂-3û•.ºHY¤tù­gyø¨IDATå§úˆ|zpþ•§?=ÝvÛméu¯{]ºý¿ÿ÷tß·|KBtáî|ÞóÒ]ÿ䟤/~ñ‹§jÔ…úÜq‡èzo&0‡€Ø@î8„¢ ñűϛå‘u ªÌ»öTñ—`š[zöëc;Õ7'ˆ1Ÿ7Ë£¶å`&°Ë‰ø¼$¼d¹ÏO Ѧx(ß”& äƒ×ÌÃU™2 ¶Ôì—,AtÅ™0Ÿ7ËCܽ7˜IÀl&š€ Ì"€(b[ÔI€±_Ö1 ¶è>.›·ã›€ ˜@Û,ÀÚ&îòL`ÄÖ`#Ææª›€ €ØÕU2®°ëjËØ.0¶ X€µMÜå™Àˆ H€-»ÄÈ\u0°húZ&ÐE`]lÛd&° `Û î2M`¤,ÀFÚð®¶ ˜À`;ØÃL )`ìíLÀL`Ì,ÀÆÜú®» ¬A€ßÌop^v`ó9ÜL`,,ÀÆÒÒ®çà †øæüÇ’©8~ü¸²Üþýû«˜>v옼&çy>“ÙXħ&`&° °%`9ª t™‚謳ÎJ¬ÌäGœÏ>ûì¤tæX¡¶k×®IÜǧݻwWÁÊ‘Vr”QÚJqs?Í€ù¿ s2>7 °±µ¸ë;Xš¹ŠdÖ  Q¦c„Ú…^X3C¦x¥|ªHÙâ)MT{jV‹Æ&`##`6²wu‡K $œ¢H’c¶ áuâĉJ”A„Ù/‰³R>%j1ïRxÉoYÆì]œm+åi?0è# °>¶šm6’p’è"º^32Û¥×”/Žy)WÊGaq¿ŽCˆÙ™€ ˜À˜ X€¹õ]÷A@1[Ĭ.®SE Gliñ=i8G”É-*À™½fÀ,À–¡æ¸&`C$`6ÄVuFIáÄŒ³^çœsNõzQ3]«G-¶Ç‘†(ûèG?ª(Õº®Ÿø‰Ÿ˜œoòÀl“4— ˜@Ÿ X€õ¹õl» ˆÀÉ“éºë®«>CQy=ð€BNí×=?yr:¿Ï$Àü_+t20Á°LSº"£&pùåé¡W¾2Ý|óÍ)]~yJ眓Ò§lâœ<6àžñ«oIl`€é,LÀzMÀ¬×ÍgãM xîsSºà‚”.ºè”ç¦ÏCQëZ€­KÐéMÀúNÀ¬ï-hûM 8t(ž¥´éóéÜ}f&`&°" °Á9™ ˜€ ˜€ ˜€ ¬JÀlUrNg&`&`&`+°[œ“™€ ¬NÀkÀVgç”&`à `6Œvt-L W,ÀzÕ\6ÖL ` @u–&`³ X€ÍæãP0á°~»†&`&`&`#`Ö±±9&`&`&`Ã'`6ü6v MÀLÀLÀ:FÀ¬c bsL` ¼l ­ì:š€ Ì"`6‹ŽÃL`$Ž=š.¼ðÂtÖYgUÛîÝ»ÓÁƒ«}›ìرciÏž=éì³Ï®êÆžºRgܾ}û&õVýµ?ÿüócàŒMÀÆMÀlÜíïÚ›@:qâD%N%GŽ©¶ýû÷W¢q"‡‘h‘ߪû¶ö"¸”‡žÔºâO8MõF¨W盪煮œÎL`¸,À†Û¶®™ ,D±ÁŒB,º½{÷¦8Dâ¶í˜‰Ûµk×Jec?‚*¯u ,Ö?gî×v}]ž ˜À8X€£]K¨% Æ QÉ)\¯å¢# â?f”mÑ!f5øǬRþº3Î4åy’o~däGÙq–.–ÍÌqê^¥’gžÖ,ô± ˜@“,Àš¤ë¼M 'Jˆö¼~D¼äŽð(„JQà ¢˜mŠ"ŒüP¥E4ñªO³R㇓h’ ã< 0ÊŒçäÉyIdɾR]òºéÜL$¼7hš€XÓ„¿ ô„"&ÎL!ž$„¨B.Àˆ‹xŠN¢GâŠ<¢ #.~q "мqñXù_3UñXáu¢ 嫸óöuyÍKçp0X–€زÄßF@@¯ù43E•s¦™­ˆC3Xší* &Ä aF8³fJyú|Œ2‰›oä“;‰AÏ€åd|n&Ð`]hÛ`[$€Ø*½ÂÓl”ÄÔ" qãåL‚ †@"o•#¤‘ÐÊE^~®4¥½Ä\©nÄÇ?nž+‘´Ÿ ˜@,Àš êÅ,S.Žˆ£rXÄ/Q¥üȇ²(ƒ0Ù%±4¯ÌʰðQG9²=y*¿µ²5-Ã}l&`›"`¶)’ÎÇL`añ¿ c"„Q.ØG°IôÅø>60¾°ëkËÙnè1:†øâu!³Vr¼ndÖ*ÎÆ)Ì{0è+ °¾¶œí6¨`ˆ,^Qêu!3_u¯ {\}›n&`ÉÌÀLÀLÀLÀZ&`Ö2pg&`&`&``î&`&`&`&Ð2 °–»804õ[æa&`c$`6ÆVwM`ËêáoÙ,o&`­°k µ 2 0‘ðÞL`¬,ÀÆÚò®· ˜€ ˜€ ˜ÀÖX€m ½ 600+ °±¶¼ëm&`&`&°5`[Cï‚M`¼¼l¼mïš›€ œ"`æž`&Ð: °Ö‘»@0ްëXƒØ °1´²ëh&0‹€Ø,:3000X€5ÕYš€ ˜€ ˜€ ˜À,`³è8ÌLÀLÀLÀ `ÖTgi&0›€×€ÍæãP0á°~»†&0!pÖYg¥Ò¶k×®´gÏžtìØ±IÜ&,Àš¤ë¼MÀú@À¬­dM`C$¾Î?ÿü·³Ï>»fì=ºviGŽIûöí«t°ƒ®]Ž300¾°ëkËÙnX€X)é…^X‰0öë:Äe!ÄJŽ0  ˜€ Œ•€ØX[Þõ%Y ±´)ad6ÊîåJ›€ ,AÀl XŽj}'°ŽCTíÞ½»iäÃëÊ|ݘ„—ʉ{ØÅóxLºèƒš‘#žÊ:qâDŒV3“Fù°ž ¿Ã‡Wþu3z¼j%]]øŽ‚ìa&`$`¶A˜ÎʺN@¢'·a#!ƒpÉB‹´0D›ü<FZû¥¼ˆ£øä©cÖ€‘NçñU¥„¢kïÞ½Seá§²d£Ê’`ÃFÒá(»ó4„‡0¯EIïMÀÚ$`Ö&m—e[& †h‰† A”;þ3’tÄÏ]ˆ!ÒDaÓ"ÀJù!”dK.šJ䉨‹Ž|ðGlåÿ@ ;öïß“TÇħ,;0Ø °mPw™&°%•Y³H¹ˆá‘Sš)ÒlU.Ü$|–`ÊO3X9¦’h’+ÍÜI<2+^?æb.Æñ± ˜€ 4IÀ¬IºÎÛ:F@â+7 ¡Â,‘fŸr¦ø*„‹M¯!—`ØQš“pCªŒ¸×+Åø½2 °:±§W“±Nš¹‹~ª£÷&`&Ð °6(» è:&óê^ó!‚g¤G!zØ´(Ÿðè8'n(š'ÀdgÝ> §y¬4«FØìLÀL`[,À¶EÞåšÀHÐÔ`ÊÅ‘Ä3Iqæ‰<Ó¬ô:±ÎæyŒtˆ-­÷’ +­ «+Ãþ&`&°i`›&êüL Ãæ 0‰DœN¾(žpÅ_V€Õ-ÂW~ukÀôú3 AÙW7Û†‘ä¯×¦1ÕÕ{0h‹€X[¤]Ž t€À,† )½R¬8¼ÔkÉ:V7˄ӌTŽE³Uñ5#qâHÆ4uöÅ8Ôº3‹G¹ìíLÀL`›,À¶Iße›@Ë$À-q“ð"œã8Û¥ua#„›f‘´Ï≼;J«Š“ "<Î^IØ‘–™0ÂÙS>iò²`”­ÅøäAìLÀL`›,À¶Iße›@ËuB¦nÆ  Í !”êÖ€Q-DŽÒPft¼(ˆrQEÞˆ;Ê’½ØÇ+ÄÜ-*Àôz“<íLÀL`Û¦ïŠÛ¶Æå›€ ˜@C4“÷¡}¨¡œ­ ˜€ ,NÀlqVŽiý$pòdJœ±ýÒKGy~饗&¶¯^rÉtý/¿ü ™€ ˜@K,ÀZíbL`«žûÜS¢ñõò—§´åsÖ€U¢°a{¾ö’—¤ÿিõ[Ó‘Ÿú©tçþÏåúoµq\¸ ˜À X€±Õ]çq@t!¾ä¶x^ °Ê?þ“?9YCvÓ·{zâ—~Iµ?%B#3!>20Æ X€5ŽØ˜€ ä*–{úÜLÀFDÀlDíªš€ ˜€ ˜€ tƒ€X7ÚÁV˜€ ˜€ ˜€ Œˆ€؈ÛU500è °n´ƒ­0Qð°Q5·+k&P `V€b/0f X€5Ë×¹›€ tŸ€X÷ÛÈšÀàX€ ®I]!0% X€- ÌÑMÀLÀLÀL`]`ëtz000X’€Ø’ÀÝLÀLÀLÀÖ%`¶.A§7Xš€×€-Ì LÀFÀl` êê˜@X€õ¡•l£ ˜@“,Àš¤ë¼MÀŠ,ÀŠXìi&0"`#jlWÕLÀLÀL ,ÀºÑ¶ÂLÀLÀL`D,ÀFÔØ®ª ˜€ ˜€ ˜@7X€u£l… ŒŠ€×€ª¹]Y0 °{™€ 4KÀ¬Y¾ÎÝL û,ÀºßF¶ÐGÀlpMê ™€ ,IàÿºX¶ññ·ïIEND®B`‚pyenphase-pyenphase-1bfa6dd/docs/data.md000066400000000000000000000013041464551303400204370ustar00rootroot00000000000000# Data The pyenphase package collects [data](#pyenphase.EnvoyData) from a specific set of endpoints on the Envoy. The set is based on the home owner [authorization level](./usage_authentication.md#authorization-levels) as common denominator. Additional endpoints [can be obtained](./advanced.md#bring-your-own-endpoint), but require application logic. Firmware version, system serialnumber and partnumber are collected from `/info` endpoint. Other endpoints are: ```{include} ../src/pyenphase/const.py :start-line : 9 :end-before : LOCAL_TIMEOUT = :literal : ``` ```{toctree} :maxdepth: 3 :hidden: data_production data_consumption phase_data data_inverters data_ensemble data_ctmeter data_raw ``` pyenphase-pyenphase-1bfa6dd/docs/data_consumption.md000066400000000000000000000015431464551303400231020ustar00rootroot00000000000000# System_Consumption data This is the energy consumption by the house reported by the Envoy, class [EnvoySystemConsumption](#pyenphase.models.system_consumption.EnvoySystemConsumption). It is only available for metered Envoy with installed and configured consumption CT Meter. ```python data: EnvoyData = await envoy.update() if data.system_consumption: print(f'Watts: {data.system_consumption.watts_now}') print(f'TodaysEnergy: {data.system_consumption.watt_hours_today}') print(f'LifetimeEnergy {data.system_consumption.watt_hours_lifetime}') print(f'Last7DaysEnergy {data.system_consumption.watt_hours_last_7_days}') ``` For metered Envoy with installed and configured CT meter in `three` phase mode and more then 1 phase active, data for individual phases is also reported, see [Phase Data](./phase_data.md#phase-data) pyenphase-pyenphase-1bfa6dd/docs/data_ctmeter.md000066400000000000000000000155001464551303400221650ustar00rootroot00000000000000# Current Transformer Data This is the data for installed current transformers (CT) for an Envoy-metered. Class [EnvoyMeterData](#pyenphase.models.meters.EnvoyMeterData). Depending on how many and which CT are installed, data is available in: - [Envoy.data.ctmeter_production](#pyenphase.EnvoyData.ctmeter_production) - [Envoy.data.ctmeter_consumption](pyenphase.EnvoyData.ctmeter_consumption) - [Envoy.data.ctmeter_storage](pyenphase.EnvoyData.ctmeter_storage) - [Envoy.data.ctmeter_production_phases](pyenphase.EnvoyData.ctmeter_production_phases) - [Envoy.data.ctmeter_consumption_phases](pyenphase.EnvoyData.ctmeter_consumption_phases) - [Envoy.data.ctmeter_storage_phases](pyenphase.EnvoyData.ctmeter_storage_phases) There is one ct for production, one for consumption and one for battery storage. One, 2 or all of these can be installed and enabled. Data is only available if CT's are enabled. Consumption CT can either be `net-consumption` installed on grid boundary or `total-consumption` measuring house load, see [ct-model](#ct-model) below. ```python data: EnvoyData = await envoy.update() production_ct = data.ctmeter_production print(f'eid: {production_ct.eid}') print(f'timestamp: {production_ct.timestamp}') print(f'energy_delivered: {production_ct.energy_delivered}') print(f'energy_received: {production_ct.energy_received}') print(f'power_factor: {production_ct.power_factor}') print(f'active_power: {production_ct.active_power}') print(f'voltage: {production_ct.voltage}') print(f'current: {production_ct.current}') print(f'frequency: {production_ct.frequency}') print(f'state: {production_ct.state}') print(f'measurement_type: {production_ct.measurement_type}') print(f'metering_status: {production_ct.metering_status}') print(f'status_flags: {production_ct.status_flags}') ``` To detect how many CT are installed use Envoy property [ct_meter_count](#pyenphase.Envoy.ct_meter_count). One can identify which CT meters are available by testing the [envoy.production_meter_type](#pyenphase.Envoy.production_meter_type), [envoy.consumption_meter_type](pyenphase.Envoy.consumption_meter_type) or [envoy.storage_meter_type](pyenphase.Envoy.storage_meter_type) ```python how_many_ct = envoy.ct_meter_count consumption_ct = 'installed' if envoy.production_meter_type else 'not installed' procuction_ct = 'installed' if envoy.consumption_meter_type else 'not installed' storage_ct = 'installed' if envoy.storage_meter_type else 'not installed' print(f'This envoy has Production ct {procuction_ct}, Consumption CT {consumption_ct} and Storage CT {storage_ct}') ``` ## Consumption CT options The consumption CT can be installed in 1 of 2 configurations. Either `Solar + Load` or `Load only`. The property [Envoy.consumption_meter_type](#pyenphase.Envoy.consumption_meter_type) will show in [which mode](#pyenphase.models.meters.CtType) the CT is operating, either `net-consumption`or `total-consumption`. When in `net-consumption` mode, the [energy_delivered](#pyenphase.models.meters.EnvoyMeterData.energy_delivered) property reports net-energy _delivered to your site/received from the grid_ while [energy_received](#pyenphase.models.meters.EnvoyMeterData.energy_received) reports net-energy _recived from your site/send to the grid_ to the grid.[^1] [^2] When in `total-consumption` it only reports on the load (house) consumption. [Active_power](#pyenphase.models.meters.EnvoyMeterData.active_power) is the current power flow and will be positive or negative based on actual flow of energy. [^1]: Provided the CT is installed on the main grid entry. [^2]: Variations between firmware release may exist. ```python net_consumption = envoy.data.consumption_ct.energy_delivered net_production = envoy.data.consumption_ct.energy_received net_power = envoy.data.consumption_ct.active_power ``` ## Production CT Options The production CT is installed to measure solar production. The [energy_delivered](#pyenphase.models.meters.EnvoyMeterData.energy_delivered) property reports the energy generated by the solar while [energy_received](#pyenphase.models.meters.EnvoyMeterData.energy_received) reports energy consumed by the solar. The latter will be minimal and is the consumption by the inverters when it exceeds the solar production, typically only during dawn and dusk periods. [^2] ## Storage CT Options The storage CT is installed to measure battery charge and discharge. The [energy_delivered](#pyenphase.models.meters.EnvoyMeterData.energy_delivered) property reports the energy discharged from the battery while [energy_received](#pyenphase.models.meters.EnvoyMeterData.energy_received) reports energy charged to battery. [^2] ## Relation to System Production and Consumption An Envoy metered with CT installed, sources the production and consumption data from the CT meters. The [system_production](data_production.md#system_production-data) data is sourced from the production CT. The [system_consumption](data_consumption.md#system_consumption-data) is total consumption by the load/house and is either sourced from the consmption CT in `total-consumption` mode or calculated from both production and consumption CT when in consumption CT is in `net-consumption` mode. Net-consumption is reported in /production as an increasing/decreasing total of import and export, CT readings however provides these as 2 increasing properties. Production is reported in system_production as a single value as well. ## Multi phase Phase data is only populated if CT's are installed on more then 1 phase for production and/or consumption phases. If the configuration is in `split phase` mode, no phases are reported for production and consumption reports, but are for CT specific data. To detect if multiple phases are reporting use the Envoy property [phase_count](#pyenphase.Envoy.phase_count). ```python from pyenphase.const import PhaseNames data: EnvoyData = await envoy.update() if Envoy.phase_count > 1: for phase in data.ctmeter_production_phases: phase_data = data.ctmeter_production_phases[phase] for key in phase_data: print(f'{phase} {key}: [phase_data{key]} ``` ## CT Model Below a generic model for installed CT's. Each CT can be considered as facing the switch-board and reporting energy delivered to the switchboard in it's `energy_delivered` property and energy received from the switchboard in `energy_received`. Power is positive towards the switchboard and negative from the switchboard. ![ct-model showing optional CT configuration](ct-model.png) These properties have different meaning for each specific CT. For a net-consumption CT, delivered is import from the grid, for Solar production CT, it is solar production and for a battery CT it is battery discharge. A total-consumption CT typically has no delivery but only receives what is consumed by the house. pyenphase-pyenphase-1bfa6dd/docs/data_ensemble.md000066400000000000000000000062231464551303400223160ustar00rootroot00000000000000# Enphase Ensemble Enphase ensemble [^1] provides information on installed battery storage and how it is used for optional EV charging or power provision. [^1]: Older name, more recent name `Enphase Energy System`. ## Enphase Enpower data The Enphase Enpower [^2] connects the home to grid power, the Encharge storage system, and solar PV. Information on it can be obtained from the [EnvoyEnpower](#pyenphase.models.enpower.EnvoyEnpower). [^2]: Older Name, more recent name IQ System Controller The Envoy class provides the methods [Go_Off_Grid](#pyenphase.Envoy.go_off_grid) and [Go_On_Grid](#pyenphase.Envoy.go_on_grid) to control the grid connection. ```python status = await envoy.go_off_grid() if status["mains_admin_state"] != "open": #error clogoing off grid status = await envoy.go_off_grid() if status["mains_admin_state"] != "closed": #error clogoing off grid ``` [Open_dry_contact](#pyenphase.Envoy.open_dry_contact) and [close_dry_contact](#pyenphase.Envoy.close_dry_contact) allows to to control the dry contacts. ```python status = await envoy.close_dry_contact(id) print(f"{envoy.data.dry_contact_status[id].status}") status = await envoy.open_dry_contact(id) print(f"{envoy.data.dry_contact_status[id].status}") ``` Dry Contact information is available in the [EnvoyData.dry_contact_status](#pyenphase.EnvoyData.dry_contact_status) and [Envoy.dry_contact_settings](#pyenphase.EnvoyData.dry_contact_settings). [Envoy.update_dry_contact](#pyenphase.Envoy.update_dry_contact) can be used to update settings, use with care and only if fully aware of impact! ```python new_setting: dict[str, Any] = {} new_setting['id'] = id new_setting['load_name'] = load_name status = await envoy.update_dry_contact(new_setting) print (status) ``` ## Envoy Encharge data The Enphase Encharge controls battery charge and discharge. Information on it can be obtained from [EnvoyEncharge](#pyenphase.models.encharge.EnvoyEncharge) for individual batteries, [EnvoyEnchargePower](#pyenphase.models.encharge.EnvoyEnchargePower) and [EnvoyEnchargeAggregate](#pyenphase.models.encharge.EnvoyEnchargeAggregate) for all batteries aggregated. The Envoy class provides the methods [Envoy.enable_charge_from_grid](#pyenphase.Envoy.enable_charge_from_grid), [Envoy.disable_charge_from_grid](#pyenphase.Envoy.disable_charge_from_grid), [Envoy.set_storage_mode](#pyenphase.Envoy.set_storage_mode) and [set_reserve_soc](#pyenphase.Envoy.set_reserve_soc). ```python status = await envoy.enable_charge_from_grid(id) print(f"{envoy.data.tariff.storage_settings.charge_from_grid}") print (status) status = await envoy.disable_charge_from_grid(id) print(f"{envoy.data.dry_contact_status[id].status}") print (status) status = await envoy.set_storage_mode(mode: EnvoyStorageMode) print(f"{envoy.data.tariff.data.tariff.storage_settings.mode}") print (status) status = await envoy.set_reserve_soc(value: int) print(f"{envoy.data.tariff.storage_settings.reserved_soc}") print (status) ``` pyenphase-pyenphase-1bfa6dd/docs/data_inverters.md000066400000000000000000000010501464551303400225360ustar00rootroot00000000000000# Inverter data Individual [inverter data](#pyenphase.models.inverter.EnvoyInverter), available for model as of firmware 3.9. are reported in `inverters: dict[str, EnvoyInverter]` attribute. ```python for inverter in data.inverters: print (f'{inverter} sn: {data.inverters[inverter].serial_number}') print (f'{inverter} watts: {data.inverters[inverter].last_report_watts}') print (f'{inverter} max watts: {data.inverters[inverter].max_report_watts}') print (f'{inverter} last report: {data.inverters[inverter].last_report_date}') ``` pyenphase-pyenphase-1bfa6dd/docs/data_production.md000066400000000000000000000020221464551303400227030ustar00rootroot00000000000000# System_Production data This is the solar production data reported by the Envoy, class [EnvoySystemProduction](#pyenphase.models.system_production.EnvoySystemProduction). ```python data: EnvoyData = await envoy.update() print(f'Watts: {data.system_production.watts_now}') print(f'TodaysEnergy: {data.system_production.watt_hours_today}') print(f'LifetimeEnergy {data.system_production.watt_hours_lifetime}') print(f'Last7DaysEnergy {data.system_production.watt_hours_last_7_days}') ``` The source of the data differs by Envoy type and firmware level. For metered Envoy types with configured current transformer (CT) production meter data comes from the /production endpoint with CT meter data. For non-metered Envoy types data comes from the `/api/v1/production` endpoint as calculated by the Envoy from inverter data. For metered Envoy with installed and configured CT meter `three` phase mode and more then 1 phase active, data for individual phases is also reported, see [Phase Data](./phase_data.md#phase-data). pyenphase-pyenphase-1bfa6dd/docs/data_raw.md000066400000000000000000000021631464551303400213140ustar00rootroot00000000000000# Raw data All data for all endpoints is stored as received in the `raw: dict[str, Any]` attribute, keyed by the endpoint path.[^1] Raw can be used for quick check if anything changed between data collections. ```json { "/api/v1/production": { "wattHoursToday": 2900, "wattHoursSevenDays": 15195, "wattHoursLifetime": 8485676, "wattsNow": 887 }, "/api/v1/production/inverters": [{ "serialNumber": "122212345678", "lastReportDate": 1703592785, "devType": 1, "lastReportWatts": 31, "maxReportWatts": 98 }, { "serialNumber": "122212345679", "lastReportDate": 1703592815, "devType": 1, "lastReportWatts": 39, "maxReportWatts": 172 } } ``` [^1]: Example only showing 2 endpoints. Production data is provided in [EnvoySystemProduction](#EnvoySystemProduction) class, Inverter data in [EnvoyInverter](#EnvoyInverter) class. ```python previous_data: EnvoyData new_data: EnvoyData = envoy.update() if new_data != previous_data: production_data = new_data.raw["/api/v1/production"] previous_data = new_data ``` pyenphase-pyenphase-1bfa6dd/docs/documenting.md000066400000000000000000000040621464551303400220460ustar00rootroot00000000000000# Coding for documentation This documentation is build from written materials as well as from the source code. The written materials augment what is available in the source code and provide examples or howto's. Using good commenting practices in the code greatly helps with improving this documentation as well. ## Autodoc The module is configured to use [Sphynx](https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html) to auto-document the source code and utilizes the [Napoleon](https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html) extension to parse Numpy and Google style docstrings. In your IDE use tools like autoDocstring for VSCode to generate sphinx-notype docstring skeletons. [^1] [^1]: Sphinx-notype seems a balance between effort and information provision. ### Docstring Example of a docstring generated with autoDoc and [included in this documentation](#pyenphase.models.system_production.EnvoySystemProduction.from_v1_api) and types automatically added: ```python @classmethod def from_v1_api(cls, data: dict[str, Any]) -> EnvoySystemProduction: """Initialize from the V1 API. :param data: JSON reply from api/v1/production endpoint :return: Lifetime, last seven days, todays energy and current power for solar production """ ``` ### Attributes Postfix attributes with a `#: Comment` to provide descriptions that are used in [generated documentation](#EnvoySystemProduction) ```python @dataclass(slots=True) class EnvoySystemProduction: """Model for the Envoy's production data.""" watt_hours_lifetime: int #: Lifetime Energy produced watt_hours_last_7_days: int #: Energy produced in previous 7 days (not including today) watt_hours_today: int #: Energy produced since start of day watts_now: int #: Current Power production ``` Similar for enumerations ```python class SupportedFeatures(enum.IntFlag): """ Flags for each feature supported :param enum: Feature Name """ INVERTERS = 1 #: Can report Invertrs METERING = 2 #: Can report CT Meter data ``` pyenphase-pyenphase-1bfa6dd/docs/index.md000066400000000000000000000005131464551303400206360ustar00rootroot00000000000000# Welcome to pyenphase documentation ```{toctree} :caption: Installation & Usage :maxdepth: 3 installation usage advanced ``` ```{toctree} :caption: Data & Reference :maxdepth: 3 data model_autodoc ``` ```{toctree} :caption: Project Info :maxdepth: 2 changelog contributing documenting ``` ```{include} ../README.md ``` pyenphase-pyenphase-1bfa6dd/docs/installation.md000066400000000000000000000002601464551303400222270ustar00rootroot00000000000000# Installation The package is published on [PyPI](https://pypi.org/project/pyenphase/) and can be installed with `pip` (or any equivalent): ```bash pip install pyenphase ``` pyenphase-pyenphase-1bfa6dd/docs/make.bat000066400000000000000000000013751464551303400206210ustar00rootroot00000000000000@ECHO OFF pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set SOURCEDIR=. set BUILDDIR=_build %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.https://www.sphinx-doc.org/ exit /b 1 ) if "%1" == "" goto help %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% :end popd pyenphase-pyenphase-1bfa6dd/docs/model_autodoc.md000066400000000000000000000120271464551303400223500ustar00rootroot00000000000000# Classes, methods and properties ```{eval-rst} .. autoclass:: pyenphase.Envoy :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ```{eval-rst} .. autoclass:: pyenphase.auth.EnvoyTokenAuth :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ```{eval-rst} .. autoclass:: pyenphase.firmware.EnvoyFirmware :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ```{eval-rst} .. autoclass:: pyenphase.EnvoyData :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ```{eval-rst} .. automodule:: pyenphase.const :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ```{eval-rst} .. automodule:: pyenphase.models.common :members: :undoc-members: :show-inheritance: :member-order: bysource ``` # Updaters ## Base class ```{eval-rst} .. automodule:: pyenphase.updaters.base :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## production ```{eval-rst} .. automodule:: pyenphase.updaters.production :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ```{eval-rst} .. automodule:: pyenphase.updaters.api_v1_production :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## Inverters ```{eval-rst} .. automodule:: pyenphase.updaters.api_v1_production_inverters :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## EnvoyEnsemble ```{eval-rst} .. automodule:: pyenphase.updaters.ensemble :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## EnvoyTariff ```{eval-rst} .. automodule:: pyenphase.updaters.tariff :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## Current Transformers ```{eval-rst} .. automodule:: pyenphase.updaters.meters :members: :undoc-members: :show-inheritance: :member-order: bysource ``` # Models ## EnvoySystemProduction ```{eval-rst} .. autoclass:: pyenphase.models.system_production.EnvoySystemProduction :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## EnvoySystemConsumption ```{eval-rst} .. autoclass:: pyenphase.models.system_consumption.EnvoySystemConsumption :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## EnvoyInverter ```{eval-rst} .. autoclass:: pyenphase.models.inverter.EnvoyInverter :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## EnvoyEncharge ```{eval-rst} .. autoclass:: pyenphase.models.encharge.EnvoyEncharge :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## EnvoyEnchargeAggregate ```{eval-rst} .. autoclass:: pyenphase.models.encharge.EnvoyEnchargeAggregate :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## EnvoyEnchargePower ```{eval-rst} .. autoclass:: pyenphase.models.encharge.EnvoyEnchargePower :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## EnvoyEnpower ```{eval-rst} .. autoclass:: pyenphase.models.enpower.EnvoyEnpower :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## EnvoyDryContactSettings ```{eval-rst} .. automodule:: pyenphase.models.dry_contacts :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## CT Meters ```{eval-rst} .. automodule:: pyenphase.models.meters :members: :undoc-members: :show-inheritance: :member-order: bysource ``` # Utilities ## Json ```{eval-rst} .. autoclass:: pyenphase.json.json_loads :members: :undoc-members: :show-inheritance: :member-order: bysource ``` ## SSL ```{eval-rst} .. automodule:: pyenphase.ssl :members: :show-inheritance: :member-order: bysource ``` # Exceptions ```{eval-rst} .. automodule:: pyenphase.exceptions :members: :show-inheritance: :member-order: bysource ``` pyenphase-pyenphase-1bfa6dd/docs/phase_data.md000066400000000000000000000114761464551303400216320ustar00rootroot00000000000000# Phase data For metered Envoy with installed and configured current transformers (CT meters) in `three` phase mode and more then 1 phase active, data for individual phases is reported for solar [production](#pyenphase.EnvoyData.system_production_phases) and house [consumption](#pyenphase.EnvoyData.system_consumption_phases). Configurations in `split` mode do not report multiple phases in their production and consumption data. Upon completion of the [probe](usage_intro.md#initialization) call, the phase setup is available. The [number of configured phases](#pyenphase.Envoy.phase_count), the [number of configured CT meters](#pyenphase.Envoy.ct_meter_count), the [phase mode configured](#pyenphase.Envoy.phase_mode) and [type of consumption CT](#pyenphase.Envoy.consumption_meter_type) are available from the envoy model. Phase names are enumerated as `L1`, `L2`, and `L3` by `pyenphase.const.PhaseNames`. Phase modes are enumerated as `single`, `split` and `three` by `pyenphase.models.meters.EnvoyPhaseMode`. The CT meter types are enumerated as `production`, ``storage`, `net-consumption` and `total-consumption` by `pyenphase.models.meters.CtType`. Be aware that `phase_count` and `phase_mode` applies for all configured CT's. The Envoy metered can however be configured with only 1, 2 or all 3 CT. In this case the not used CT data in `system_production_phases` or `system_consumption_phases` or `system_storage_phases` will be `None` The Envoy property [active_phase_count](#pyenphase.Envoy.active_phase_count) reports the number of phases reported in the production and consumption report. This will be 0 for `single` and `split` phase use and the actual used phases for `three` mode. ```python from pyenphase import Envoy from pyenphase.const import PhaseNames from pyenphase.models.meters import CtType, EnvoyPhaseMode envoy = Envoy(host_ip_or_name) await envoy.setup() print(f'Envoy {envoy.host} running {envoy.firmware}, sn: {envoy.serial_number}') await envoy.authenticate(username=username, password=password, token=token) await envoy.probe() print(f'Number of configured Phases: {envoy.phase_count}') print(f'Number of configured CT meters: {envoy.ct_meter_count}') print(f'Phases are configured in: {envoy.phase_mode} mode') print(f'Phases reported in production/consumption: {envoy.active_phase_count} mode') ``` ## Production Phase data Production phase data is available in Envoy data.[system_production_phases: dict[str,EnvoySystemProduction]](#pyenphase.EnvoyData.system_production_phases). ```python from pyenphase.const import PhaseNames data: EnvoyData = await envoy.update() # if more then 1 phase reported then get phase data if Envoy.actual_phase_count > 1 and data.system_production_phases: # Get data by looping over phase data for phase in data.system_production_phases: print(f'{phase} Watts: {data.system_production_phases[phase].watts_now}') print(f'{phase} TodaysEnergy: {data.system_production_phases[phase].watt_hours_today}') print(f'{phase} LifetimeEnergy {data.system_production_phases[phase].watt_hours_lifetime}') print(f'{phase} Last7DaysEnergy {data.system_production_phases[phase].watt_hours_last_7_days}') # report specific phase data by using PhaseNames (for phase 1) print( f'Value watt_hours_lifetime : {data.system_production_phases[PhaseNames.PHASE_1].watt_hours_lifetime}' ) # report specific phase data by using phase index 0-2 (for phase 1) print( f'Value watt_hours_lifetime : {data.system_production_phases[list(PhaseNames)[0]].watt_hours_lifetime}' ) ``` ## Consumption Phase data Consumption phase data is available in Envoy data.[system_consumption_phases: dict[str,EnvoySystemConsumption]](#pyenphase.EnvoyData.system_consumption_phases). ```python from pyenphase.const import PhaseNames data: EnvoyData = await envoy.update() if Envoy.phase_count > 1: for phase in data.system_consumption_phases and data.system_consumption_phases: print(f'{phase} Watts: {data.system_consumption_phases[phase].watts_now}') print(f'{phase} TodaysEnergy: {data.system_consumption_phases[phase].watt_hours_today}') print(f'{phase} LifetimeEnergy {system_consumption_phases.[phase].watt_hours_lifetime}') print(f'{phase} Last7DaysEnergy {system_consumption_phases.[phase].watt_hours_last_7_days}') # report specific phase data by using PhaseNames (for phase 1) print( f'Value watt_hours_lifetime : {data.system_consumption_phases[PhaseNames.PHASE_1].watt_hours_lifetime}' ) # report specific phase data by using phase index 0-2 (for phase 1) print( f'Value watt_hours_lifetime : {data.system_consumption_phases[list(PhaseNames)[0]].watt_hours_lifetime}' ) ``` pyenphase-pyenphase-1bfa6dd/docs/usage.md000066400000000000000000000004621464551303400206360ustar00rootroot00000000000000# Usage The pyenphase package provides the Envoy class to collect data from [Enphase IQ Gateway](https://enphase.com/en-us/products-and-services/envoy-and-combiner). To use this package, import it: ```python import pyenphase ``` ```{toctree} :maxdepth: 3 :hidden: usage_intro usage_authentication ``` pyenphase-pyenphase-1bfa6dd/docs/usage_authentication.md000066400000000000000000000105451464551303400237400ustar00rootroot00000000000000# Authentication Before firmware 7, authentication was based on username/password. In these cases either `Envoy` or `Installer` usernames with a blank password or a known username/password can be used. The token is not utilized. The authentication module will calculate the passwords for these 2 accounts, if left blank, based on the serial number retrieved by the setup method. As of firmware 7, token based authentication is required. The authentication module can retrieve the token from the Enlighten website using the retrieved Envoy serial number and the Enlighten username and password which need to be specified. If the token is known, it can be specified and it will be used instead of obtaining one from the internet. ```python envoy = Envoy(host_ip_or_name) await envoy.setup() await envoy.authenticate(username=username, password=password, token=token) ``` ## Obtain and renew token Upon completion of the authentication, the token can be requested and stored for later reuse in authentication. The application should check for [token expiry](#pyenphase.auth.EnvoyTokenAuth.expire_timestamp) and request timely [renewal](#pyenphase.auth.EnvoyTokenAuth.refresh). Until the token is expired it can be used with each authenticate request. ```python from pyenphase import Envoy from pyenphase.auth import EnvoyTokenAuth token: str = "get token from some storage" envoy = Envoy(host_ip_or_name) await envoy.setup() await envoy.authenticate(username=username, password=password, token=token) assert isinstance(envoy.auth, EnvoyTokenAuth) expire_time = envoy.auth.expire_timestamp if expire_time < (datetime.now() - timedelta(days=7)): await self.envoy.auth.refresh() token = envoy.auth.token # save token in some storage ``` ## Re-Authentication When authentication is omitted or data requests experience an authorization failure (401 or 403) an `EnvoyAuthenticationRequired` error is returned. When this occurs, authentication should be repeated. ```python try: data: EnvoyData = await envoy.update() except EnvoyAuthenticationRequired: await envoy.authenticate(username=username, password=password,token=token) ``` ## Authorization levels Enphase accounts are either home-owner or installer/DIY accounts. The Home owner account provides access to the data information endpoints. The installer account has in addition access to configuration and setup endpoints as well [^2]. The authentication class provides the methods `is_consumer` and `manager_token` to determine the nature of the account. ```python assert isinstance(envoy.auth, EnvoyTokenAuth) token = envoy.auth.token if envoy.auth.manager_token: ... if envoy.auth.is_consumer: ... ``` [^2]: Data provided by pyenphase is only sourced from endpoints that allow access by at least Home owner accounts. The Envoy [Request method](#pyenphase.Envoy.request) allows access to [additional endpoints](./advanced.md#bring-your-own-endpoint), provided the user account has the required authorization level. ### Authentication over firmware update A special case of Envoy outage is the firmware update. These get pushed by Enphase, not frequently and not always at an expected moment. It will cause an outage of the Envoy during the patching process and an authentication error when communication is restored. Re-authentication as described above may work with existing token or it may fail and a new token would be needed. Furthermore the firmware version has changed and it may have impact on behavior. The Firmware version is only obtained in the setup method of the Envoy, this needs a repeat as well in this case. ```python from pyenphase import Envoy, EnvoyData envoy = Envoy(host_ip_or_name) await envoy.setup() firmware=envoy.firmware await envoy.authenticate(username=username, password=password, token=token) while True: try: data: EnvoyData = await envoy.update() except EnvoyAuthenticationRequired: expire_time = envoy.auth.expire_timestamp if expire_time < now.timestamp(): await self.envoy.auth.refresh() else: # potential outage, get firmware await envoy.setup() # authenticate without token to get new one await envoy.authenticate(username=username, password=password) # if firmware changed on us force re-init of data updaters if firmware != envoy.firmware: envoy.probe() ``` pyenphase-pyenphase-1bfa6dd/docs/usage_intro.md000066400000000000000000000035251464551303400220540ustar00rootroot00000000000000# Initialization Access to the Envoy device requires specifying its ip address or dns name when creating an Instance of the [Envoy class](#pyenphase.Envoy). Next the envoy serial number and active firmware version should be obtained to identify which authentication method is required. Use the [setup method](#pyenphase.Envoy.setup). Once the firmware version is known, authentication can take place using the required parameters for the firmware. The [authenticate method](#pyenphase.Envoy.authenticate) requires a username and password and/or a JWT Token. What the username and password are and if the token is required [depends on the firmware](./usage_authentication.md#authentication) active in the Envoy. Upon successful authentication the data collection can be initiated by using the [probe method](#pyenphase.Envoy.probe). This will gather and set all required information for the data collection.[^1] Upon probe completion the data can be collected (repeatedly) using the [update method](#pyenphase.Envoy.update). ```python from pyenphase import Envoy, EnvoyData envoy = Envoy(host_ip_or_name) await envoy.setup() print(f'Envoy {envoy.host} running {envoy.firmware}, sn: {envoy.serial_number}') await envoy.authenticate(username=username, password=password, token=token) await envoy.probe() print(f'Phases: {envoy.phase_count}') while True: data: EnvoyData = await envoy.update() print(f'Watts: {data.system_production.watts_now}') print(f'TodaysEnergy: {data.system_production.watt_hours_today}') print(f'LifetimeEnergy {data.system_production.watt_hours_lifetime}') print(f'Last7DaysEnergy {data.system_production.watt_hours_last_7_days}') await asyncio.sleep(some_time) ``` [^1]: The probe method will be called by the update method if not called before. It needs to be called only once to initiate data collection parameters. pyenphase-pyenphase-1bfa6dd/poetry.lock000066400000000000000000003272201464551303400204600ustar00rootroot00000000000000# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "alabaster" version = "0.7.16" description = "A light, configurable Sphinx theme" optional = false python-versions = ">=3.9" files = [ {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] name = "anyio" version = "4.3.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, ] [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] [[package]] name = "async-timeout" version = "4.0.3" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.7" files = [ {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] name = "awesomeversion" version = "24.2.0" description = "One version package to rule them all, One version package to find them, One version package to bring them all, and in the darkness bind them." optional = false python-versions = ">=3.8,<4.0" files = [ {file = "awesomeversion-24.2.0-py3-none-any.whl", hash = "sha256:ba365d1ad4e42aa5afdbc46b639f349e52db2d859d7c46a34744ca15ebf1430a"}, {file = "awesomeversion-24.2.0.tar.gz", hash = "sha256:47a6dcbbe2921b725f75106a66ab30f26f1f33dbc5e07bc8e1e39d8eb921f53c"}, ] [[package]] name = "babel" version = "2.14.0" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, ] [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "certifi" version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] [[package]] name = "coverage" version = "7.4.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, ] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] toml = ["tomli"] [[package]] name = "docutils" version = "0.20.1" description = "Docutils -- Python Documentation Utilities" optional = false python-versions = ">=3.7" files = [ {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, ] [[package]] name = "envoy-utils" version = "0.0.1" description = "Python utilities for the Enphase Envoy" optional = false python-versions = ">=3.8" files = [ {file = "envoy_utils-0.0.1-py3-none-any.whl", hash = "sha256:42af6458241549a381d7897b18f74077224cf955b412fdb36088fc6c8e3f992a"}, {file = "envoy_utils-0.0.1.tar.gz", hash = "sha256:0cc435b2b9a8c2a664530c85bfd108e4bd7500079aa1bb93a69628314d03f68f"}, ] [package.dependencies] zeroconf = "*" [[package]] name = "exceptiongroup" version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] test = ["pytest (>=6)"] [[package]] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, ] [[package]] name = "httpcore" version = "1.0.5" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] [package.dependencies] certifi = "*" h11 = ">=0.13,<0.15" [package.extras] asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] trio = ["trio (>=0.22.0,<0.26.0)"] [[package]] name = "httpx" version = "0.27.0" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, ] [package.dependencies] anyio = "*" certifi = "*" httpcore = "==1.*" idna = "*" sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] [[package]] name = "idna" version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "ifaddr" version = "0.2.0" description = "Cross-platform network interface and IP address enumeration library" optional = false python-versions = "*" files = [ {file = "ifaddr-0.2.0-py3-none-any.whl", hash = "sha256:085e0305cfe6f16ab12d72e2024030f5d52674afad6911bb1eee207177b8a748"}, {file = "ifaddr-0.2.0.tar.gz", hash = "sha256:cc0cbfcaabf765d44595825fb96a99bb12c79716b73b44330ea38ee2b0c4aed4"}, ] [[package]] name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] [[package]] name = "jinja2" version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] [[package]] name = "lxml" version = "5.2.1" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" files = [ {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1f7785f4f789fdb522729ae465adcaa099e2a3441519df750ebdccc481d961a1"}, {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cc6ee342fb7fa2471bd9b6d6fdfc78925a697bf5c2bcd0a302e98b0d35bfad3"}, {file = "lxml-5.2.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:794f04eec78f1d0e35d9e0c36cbbb22e42d370dda1609fb03bcd7aeb458c6377"}, {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817d420c60a5183953c783b0547d9eb43b7b344a2c46f69513d5952a78cddf3"}, {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2213afee476546a7f37c7a9b4ad4d74b1e112a6fafffc9185d6d21f043128c81"}, {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b070bbe8d3f0f6147689bed981d19bbb33070225373338df755a46893528104a"}, {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e02c5175f63effbd7c5e590399c118d5db6183bbfe8e0d118bdb5c2d1b48d937"}, {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:3dc773b2861b37b41a6136e0b72a1a44689a9c4c101e0cddb6b854016acc0aa8"}, {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:d7520db34088c96cc0e0a3ad51a4fd5b401f279ee112aa2b7f8f976d8582606d"}, {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:bcbf4af004f98793a95355980764b3d80d47117678118a44a80b721c9913436a"}, {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2b44bec7adf3e9305ce6cbfa47a4395667e744097faed97abb4728748ba7d47"}, {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1c5bb205e9212d0ebddf946bc07e73fa245c864a5f90f341d11ce7b0b854475d"}, {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2c9d147f754b1b0e723e6afb7ba1566ecb162fe4ea657f53d2139bbf894d050a"}, {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3545039fa4779be2df51d6395e91a810f57122290864918b172d5dc7ca5bb433"}, {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a91481dbcddf1736c98a80b122afa0f7296eeb80b72344d7f45dc9f781551f56"}, {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2ddfe41ddc81f29a4c44c8ce239eda5ade4e7fc305fb7311759dd6229a080052"}, {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a7baf9ffc238e4bf401299f50e971a45bfcc10a785522541a6e3179c83eabf0a"}, {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:31e9a882013c2f6bd2f2c974241bf4ba68c85eba943648ce88936d23209a2e01"}, {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0a15438253b34e6362b2dc41475e7f80de76320f335e70c5528b7148cac253a1"}, {file = "lxml-5.2.1-cp310-cp310-win32.whl", hash = "sha256:6992030d43b916407c9aa52e9673612ff39a575523c5f4cf72cdef75365709a5"}, {file = "lxml-5.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:da052e7962ea2d5e5ef5bc0355d55007407087392cf465b7ad84ce5f3e25fe0f"}, {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:70ac664a48aa64e5e635ae5566f5227f2ab7f66a3990d67566d9907edcbbf867"}, {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1ae67b4e737cddc96c99461d2f75d218bdf7a0c3d3ad5604d1f5e7464a2f9ffe"}, {file = "lxml-5.2.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f18a5a84e16886898e51ab4b1d43acb3083c39b14c8caeb3589aabff0ee0b270"}, {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6f2c8372b98208ce609c9e1d707f6918cc118fea4e2c754c9f0812c04ca116d"}, {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:394ed3924d7a01b5bd9a0d9d946136e1c2f7b3dc337196d99e61740ed4bc6fe1"}, {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d077bc40a1fe984e1a9931e801e42959a1e6598edc8a3223b061d30fbd26bbc"}, {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:764b521b75701f60683500d8621841bec41a65eb739b8466000c6fdbc256c240"}, {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3a6b45da02336895da82b9d472cd274b22dc27a5cea1d4b793874eead23dd14f"}, {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:5ea7b6766ac2dfe4bcac8b8595107665a18ef01f8c8343f00710b85096d1b53a"}, {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:e196a4ff48310ba62e53a8e0f97ca2bca83cdd2fe2934d8b5cb0df0a841b193a"}, {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:200e63525948e325d6a13a76ba2911f927ad399ef64f57898cf7c74e69b71095"}, {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dae0ed02f6b075426accbf6b2863c3d0a7eacc1b41fb40f2251d931e50188dad"}, {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:ab31a88a651039a07a3ae327d68ebdd8bc589b16938c09ef3f32a4b809dc96ef"}, {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:df2e6f546c4df14bc81f9498bbc007fbb87669f1bb707c6138878c46b06f6510"}, {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5dd1537e7cc06efd81371f5d1a992bd5ab156b2b4f88834ca852de4a8ea523fa"}, {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9b9ec9c9978b708d488bec36b9e4c94d88fd12ccac3e62134a9d17ddba910ea9"}, {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8e77c69d5892cb5ba71703c4057091e31ccf534bd7f129307a4d084d90d014b8"}, {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a8d5c70e04aac1eda5c829a26d1f75c6e5286c74743133d9f742cda8e53b9c2f"}, {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c94e75445b00319c1fad60f3c98b09cd63fe1134a8a953dcd48989ef42318534"}, {file = "lxml-5.2.1-cp311-cp311-win32.whl", hash = "sha256:4951e4f7a5680a2db62f7f4ab2f84617674d36d2d76a729b9a8be4b59b3659be"}, {file = "lxml-5.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:5c670c0406bdc845b474b680b9a5456c561c65cf366f8db5a60154088c92d102"}, {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:abc25c3cab9ec7fcd299b9bcb3b8d4a1231877e425c650fa1c7576c5107ab851"}, {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6935bbf153f9a965f1e07c2649c0849d29832487c52bb4a5c5066031d8b44fd5"}, {file = "lxml-5.2.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d793bebb202a6000390a5390078e945bbb49855c29c7e4d56a85901326c3b5d9"}, {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd5562927cdef7c4f5550374acbc117fd4ecc05b5007bdfa57cc5355864e0a4"}, {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e7259016bc4345a31af861fdce942b77c99049d6c2107ca07dc2bba2435c1d9"}, {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:530e7c04f72002d2f334d5257c8a51bf409db0316feee7c87e4385043be136af"}, {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59689a75ba8d7ffca577aefd017d08d659d86ad4585ccc73e43edbfc7476781a"}, {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f9737bf36262046213a28e789cc82d82c6ef19c85a0cf05e75c670a33342ac2c"}, {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:3a74c4f27167cb95c1d4af1c0b59e88b7f3e0182138db2501c353555f7ec57f4"}, {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:68a2610dbe138fa8c5826b3f6d98a7cfc29707b850ddcc3e21910a6fe51f6ca0"}, {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f0a1bc63a465b6d72569a9bba9f2ef0334c4e03958e043da1920299100bc7c08"}, {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c2d35a1d047efd68027817b32ab1586c1169e60ca02c65d428ae815b593e65d4"}, {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:79bd05260359170f78b181b59ce871673ed01ba048deef4bf49a36ab3e72e80b"}, {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:865bad62df277c04beed9478fe665b9ef63eb28fe026d5dedcb89b537d2e2ea6"}, {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:44f6c7caff88d988db017b9b0e4ab04934f11e3e72d478031efc7edcac6c622f"}, {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:71e97313406ccf55d32cc98a533ee05c61e15d11b99215b237346171c179c0b0"}, {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:057cdc6b86ab732cf361f8b4d8af87cf195a1f6dc5b0ff3de2dced242c2015e0"}, {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f3bbbc998d42f8e561f347e798b85513ba4da324c2b3f9b7969e9c45b10f6169"}, {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491755202eb21a5e350dae00c6d9a17247769c64dcf62d8c788b5c135e179dc4"}, {file = "lxml-5.2.1-cp312-cp312-win32.whl", hash = "sha256:8de8f9d6caa7f25b204fc861718815d41cbcf27ee8f028c89c882a0cf4ae4134"}, {file = "lxml-5.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:f2a9efc53d5b714b8df2b4b3e992accf8ce5bbdfe544d74d5c6766c9e1146a3a"}, {file = "lxml-5.2.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:70a9768e1b9d79edca17890175ba915654ee1725975d69ab64813dd785a2bd5c"}, {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c38d7b9a690b090de999835f0443d8aa93ce5f2064035dfc48f27f02b4afc3d0"}, {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5670fb70a828663cc37552a2a85bf2ac38475572b0e9b91283dc09efb52c41d1"}, {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:958244ad566c3ffc385f47dddde4145088a0ab893504b54b52c041987a8c1863"}, {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6241d4eee5f89453307c2f2bfa03b50362052ca0af1efecf9fef9a41a22bb4f"}, {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2a66bf12fbd4666dd023b6f51223aed3d9f3b40fef06ce404cb75bafd3d89536"}, {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:9123716666e25b7b71c4e1789ec829ed18663152008b58544d95b008ed9e21e9"}, {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:0c3f67e2aeda739d1cc0b1102c9a9129f7dc83901226cc24dd72ba275ced4218"}, {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5d5792e9b3fb8d16a19f46aa8208987cfeafe082363ee2745ea8b643d9cc5b45"}, {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:88e22fc0a6684337d25c994381ed8a1580a6f5ebebd5ad41f89f663ff4ec2885"}, {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:21c2e6b09565ba5b45ae161b438e033a86ad1736b8c838c766146eff8ceffff9"}, {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:afbbdb120d1e78d2ba8064a68058001b871154cc57787031b645c9142b937a62"}, {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:627402ad8dea044dde2eccde4370560a2b750ef894c9578e1d4f8ffd54000461"}, {file = "lxml-5.2.1-cp36-cp36m-win32.whl", hash = "sha256:e89580a581bf478d8dcb97d9cd011d567768e8bc4095f8557b21c4d4c5fea7d0"}, {file = "lxml-5.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:59565f10607c244bc4c05c0c5fa0c190c990996e0c719d05deec7030c2aa8289"}, {file = "lxml-5.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:857500f88b17a6479202ff5fe5f580fc3404922cd02ab3716197adf1ef628029"}, {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56c22432809085b3f3ae04e6e7bdd36883d7258fcd90e53ba7b2e463efc7a6af"}, {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a55ee573116ba208932e2d1a037cc4b10d2c1cb264ced2184d00b18ce585b2c0"}, {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:6cf58416653c5901e12624e4013708b6e11142956e7f35e7a83f1ab02f3fe456"}, {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:64c2baa7774bc22dd4474248ba16fe1a7f611c13ac6123408694d4cc93d66dbd"}, {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:74b28c6334cca4dd704e8004cba1955af0b778cf449142e581e404bd211fb619"}, {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7221d49259aa1e5a8f00d3d28b1e0b76031655ca74bb287123ef56c3db92f213"}, {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3dbe858ee582cbb2c6294dc85f55b5f19c918c2597855e950f34b660f1a5ede6"}, {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:04ab5415bf6c86e0518d57240a96c4d1fcfc3cb370bb2ac2a732b67f579e5a04"}, {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:6ab833e4735a7e5533711a6ea2df26459b96f9eec36d23f74cafe03631647c41"}, {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f443cdef978430887ed55112b491f670bba6462cea7a7742ff8f14b7abb98d75"}, {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:9e2addd2d1866fe112bc6f80117bcc6bc25191c5ed1bfbcf9f1386a884252ae8"}, {file = "lxml-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:f51969bac61441fd31f028d7b3b45962f3ecebf691a510495e5d2cd8c8092dbd"}, {file = "lxml-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b0b58fbfa1bf7367dde8a557994e3b1637294be6cf2169810375caf8571a085c"}, {file = "lxml-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:804f74efe22b6a227306dd890eecc4f8c59ff25ca35f1f14e7482bbce96ef10b"}, {file = "lxml-5.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08802f0c56ed150cc6885ae0788a321b73505d2263ee56dad84d200cab11c07a"}, {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8c09ed18ecb4ebf23e02b8e7a22a05d6411911e6fabef3a36e4f371f4f2585"}, {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d30321949861404323c50aebeb1943461a67cd51d4200ab02babc58bd06a86"}, {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:b560e3aa4b1d49e0e6c847d72665384db35b2f5d45f8e6a5c0072e0283430533"}, {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:058a1308914f20784c9f4674036527e7c04f7be6fb60f5d61353545aa7fcb739"}, {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:adfb84ca6b87e06bc6b146dc7da7623395db1e31621c4785ad0658c5028b37d7"}, {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:417d14450f06d51f363e41cace6488519038f940676ce9664b34ebf5653433a5"}, {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a2dfe7e2473f9b59496247aad6e23b405ddf2e12ef0765677b0081c02d6c2c0b"}, {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bf2e2458345d9bffb0d9ec16557d8858c9c88d2d11fed53998512504cd9df49b"}, {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:58278b29cb89f3e43ff3e0c756abbd1518f3ee6adad9e35b51fb101c1c1daaec"}, {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:64641a6068a16201366476731301441ce93457eb8452056f570133a6ceb15fca"}, {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:78bfa756eab503673991bdcf464917ef7845a964903d3302c5f68417ecdc948c"}, {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11a04306fcba10cd9637e669fd73aa274c1c09ca64af79c041aa820ea992b637"}, {file = "lxml-5.2.1-cp38-cp38-win32.whl", hash = "sha256:66bc5eb8a323ed9894f8fa0ee6cb3e3fb2403d99aee635078fd19a8bc7a5a5da"}, {file = "lxml-5.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:9676bfc686fa6a3fa10cd4ae6b76cae8be26eb5ec6811d2a325636c460da1806"}, {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cf22b41fdae514ee2f1691b6c3cdeae666d8b7fa9434de445f12bbeee0cf48dd"}, {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec42088248c596dbd61d4ae8a5b004f97a4d91a9fd286f632e42e60b706718d7"}, {file = "lxml-5.2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd53553ddad4a9c2f1f022756ae64abe16da1feb497edf4d9f87f99ec7cf86bd"}, {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feaa45c0eae424d3e90d78823f3828e7dc42a42f21ed420db98da2c4ecf0a2cb"}, {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddc678fb4c7e30cf830a2b5a8d869538bc55b28d6c68544d09c7d0d8f17694dc"}, {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:853e074d4931dbcba7480d4dcab23d5c56bd9607f92825ab80ee2bd916edea53"}, {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4691d60512798304acb9207987e7b2b7c44627ea88b9d77489bbe3e6cc3bd4"}, {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:beb72935a941965c52990f3a32d7f07ce869fe21c6af8b34bf6a277b33a345d3"}, {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:6588c459c5627fefa30139be4d2e28a2c2a1d0d1c265aad2ba1935a7863a4913"}, {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:588008b8497667f1ddca7c99f2f85ce8511f8f7871b4a06ceede68ab62dff64b"}, {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6787b643356111dfd4032b5bffe26d2f8331556ecb79e15dacb9275da02866e"}, {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7c17b64b0a6ef4e5affae6a3724010a7a66bda48a62cfe0674dabd46642e8b54"}, {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:27aa20d45c2e0b8cd05da6d4759649170e8dfc4f4e5ef33a34d06f2d79075d57"}, {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d4f2cc7060dc3646632d7f15fe68e2fa98f58e35dd5666cd525f3b35d3fed7f8"}, {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff46d772d5f6f73564979cd77a4fffe55c916a05f3cb70e7c9c0590059fb29ef"}, {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:96323338e6c14e958d775700ec8a88346014a85e5de73ac7967db0367582049b"}, {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:52421b41ac99e9d91934e4d0d0fe7da9f02bfa7536bb4431b4c05c906c8c6919"}, {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7a7efd5b6d3e30d81ec68ab8a88252d7c7c6f13aaa875009fe3097eb4e30b84c"}, {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ed777c1e8c99b63037b91f9d73a6aad20fd035d77ac84afcc205225f8f41188"}, {file = "lxml-5.2.1-cp39-cp39-win32.whl", hash = "sha256:644df54d729ef810dcd0f7732e50e5ad1bd0a135278ed8d6bcb06f33b6b6f708"}, {file = "lxml-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:9ca66b8e90daca431b7ca1408cae085d025326570e57749695d6a01454790e95"}, {file = "lxml-5.2.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9b0ff53900566bc6325ecde9181d89afadc59c5ffa39bddf084aaedfe3b06a11"}, {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd6037392f2d57793ab98d9e26798f44b8b4da2f2464388588f48ac52c489ea1"}, {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9c07e7a45bb64e21df4b6aa623cb8ba214dfb47d2027d90eac197329bb5e94"}, {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3249cc2989d9090eeac5467e50e9ec2d40704fea9ab72f36b034ea34ee65ca98"}, {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f42038016852ae51b4088b2862126535cc4fc85802bfe30dea3500fdfaf1864e"}, {file = "lxml-5.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:533658f8fbf056b70e434dff7e7aa611bcacb33e01f75de7f821810e48d1bb66"}, {file = "lxml-5.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:622020d4521e22fb371e15f580d153134bfb68d6a429d1342a25f051ec72df1c"}, {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa7b51824aa0ee957ccd5a741c73e6851de55f40d807f08069eb4c5a26b2baa"}, {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c6ad0fbf105f6bcc9300c00010a2ffa44ea6f555df1a2ad95c88f5656104817"}, {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e233db59c8f76630c512ab4a4daf5a5986da5c3d5b44b8e9fc742f2a24dbd460"}, {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a014510830df1475176466b6087fc0c08b47a36714823e58d8b8d7709132a96"}, {file = "lxml-5.2.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d38c8f50ecf57f0463399569aa388b232cf1a2ffb8f0a9a5412d0db57e054860"}, {file = "lxml-5.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5aea8212fb823e006b995c4dda533edcf98a893d941f173f6c9506126188860d"}, {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff097ae562e637409b429a7ac958a20aab237a0378c42dabaa1e3abf2f896e5f"}, {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f5d65c39f16717a47c36c756af0fb36144069c4718824b7533f803ecdf91138"}, {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3d0c3dd24bb4605439bf91068598d00c6370684f8de4a67c2992683f6c309d6b"}, {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e32be23d538753a8adb6c85bd539f5fd3b15cb987404327c569dfc5fd8366e85"}, {file = "lxml-5.2.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cc518cea79fd1e2f6c90baafa28906d4309d24f3a63e801d855e7424c5b34144"}, {file = "lxml-5.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a0af35bd8ebf84888373630f73f24e86bf016642fb8576fba49d3d6b560b7cbc"}, {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8aca2e3a72f37bfc7b14ba96d4056244001ddcc18382bd0daa087fd2e68a354"}, {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ca1e8188b26a819387b29c3895c47a5e618708fe6f787f3b1a471de2c4a94d9"}, {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c8ba129e6d3b0136a0f50345b2cb3db53f6bda5dd8c7f5d83fbccba97fb5dcb5"}, {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e998e304036198b4f6914e6a1e2b6f925208a20e2042563d9734881150c6c246"}, {file = "lxml-5.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d3be9b2076112e51b323bdf6d5a7f8a798de55fb8d95fcb64bd179460cdc0704"}, {file = "lxml-5.2.1.tar.gz", hash = "sha256:3f7765e69bbce0906a7c74d5fe46d2c7a7596147318dbc08e4a2431f3060e306"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] html-clean = ["lxml-html-clean"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=3.0.10)"] [[package]] name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, ] [package.dependencies] mdurl = ">=0.1,<1.0" [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark"] code-style = ["pre-commit (>=3.0,<4.0)"] compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "mdit-py-plugins" version = "0.4.0" description = "Collection of plugins for markdown-it-py" optional = false python-versions = ">=3.8" files = [ {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, ] [package.dependencies] markdown-it-py = ">=1.0.0,<4.0.0" [package.extras] code-style = ["pre-commit"] rtd = ["myst-parser", "sphinx-book-theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] [[package]] name = "myst-parser" version = "2.0.0" description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," optional = false python-versions = ">=3.8" files = [ {file = "myst_parser-2.0.0-py3-none-any.whl", hash = "sha256:7c36344ae39c8e740dad7fdabf5aa6fc4897a813083c6cc9990044eb93656b14"}, {file = "myst_parser-2.0.0.tar.gz", hash = "sha256:ea929a67a6a0b1683cdbe19b8d2e724cd7643f8aa3e7bb18dd65beac3483bead"}, ] [package.dependencies] docutils = ">=0.16,<0.21" jinja2 = "*" markdown-it-py = ">=3.0,<4.0" mdit-py-plugins = ">=0.4,<1.0" pyyaml = "*" sphinx = ">=6,<8" [package.extras] code-style = ["pre-commit (>=3.0,<4.0)"] linkify = ["linkify-it-py (>=2.0,<3.0)"] rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-book-theme (==1.0.0rc2)", "sphinx-copybutton", "sphinx-design2", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.8.2,<0.9.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] [[package]] name = "orjson" version = "3.10.1" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ {file = "orjson-3.10.1-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8ec2fc456d53ea4a47768f622bb709be68acd455b0c6be57e91462259741c4f3"}, {file = "orjson-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e900863691d327758be14e2a491931605bd0aded3a21beb6ce133889830b659"}, {file = "orjson-3.10.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab6ecbd6fe57785ebc86ee49e183f37d45f91b46fc601380c67c5c5e9c0014a2"}, {file = "orjson-3.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af7c68b01b876335cccfb4eee0beef2b5b6eae1945d46a09a7c24c9faac7a77"}, {file = "orjson-3.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:915abfb2e528677b488a06eba173e9d7706a20fdfe9cdb15890b74ef9791b85e"}, {file = "orjson-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe3fd4a36eff9c63d25503b439531d21828da9def0059c4f472e3845a081aa0b"}, {file = "orjson-3.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d229564e72cfc062e6481a91977a5165c5a0fdce11ddc19ced8471847a67c517"}, {file = "orjson-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9e00495b18304173ac843b5c5fbea7b6f7968564d0d49bef06bfaeca4b656f4e"}, {file = "orjson-3.10.1-cp310-none-win32.whl", hash = "sha256:fd78ec55179545c108174ba19c1795ced548d6cac4d80d014163033c047ca4ea"}, {file = "orjson-3.10.1-cp310-none-win_amd64.whl", hash = "sha256:50ca42b40d5a442a9e22eece8cf42ba3d7cd4cd0f2f20184b4d7682894f05eec"}, {file = "orjson-3.10.1-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b345a3d6953628df2f42502297f6c1e1b475cfbf6268013c94c5ac80e8abc04c"}, {file = "orjson-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caa7395ef51af4190d2c70a364e2f42138e0e5fcb4bc08bc9b76997659b27dab"}, {file = "orjson-3.10.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b01d701decd75ae092e5f36f7b88a1e7a1d3bb7c9b9d7694de850fb155578d5a"}, {file = "orjson-3.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5028981ba393f443d8fed9049211b979cadc9d0afecf162832f5a5b152c6297"}, {file = "orjson-3.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31ff6a222ea362b87bf21ff619598a4dc1106aaafaea32b1c4876d692891ec27"}, {file = "orjson-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e852a83d7803d3406135fb7a57cf0c1e4a3e73bac80ec621bd32f01c653849c5"}, {file = "orjson-3.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2567bc928ed3c3fcd90998009e8835de7c7dc59aabcf764b8374d36044864f3b"}, {file = "orjson-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4ce98cac60b7bb56457bdd2ed7f0d5d7f242d291fdc0ca566c83fa721b52e92d"}, {file = "orjson-3.10.1-cp311-none-win32.whl", hash = "sha256:813905e111318acb356bb8029014c77b4c647f8b03f314e7b475bd9ce6d1a8ce"}, {file = "orjson-3.10.1-cp311-none-win_amd64.whl", hash = "sha256:03a3ca0b3ed52bed1a869163a4284e8a7b0be6a0359d521e467cdef7e8e8a3ee"}, {file = "orjson-3.10.1-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f02c06cee680b1b3a8727ec26c36f4b3c0c9e2b26339d64471034d16f74f4ef5"}, {file = "orjson-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1aa2f127ac546e123283e437cc90b5ecce754a22306c7700b11035dad4ccf85"}, {file = "orjson-3.10.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2cf29b4b74f585225196944dffdebd549ad2af6da9e80db7115984103fb18a96"}, {file = "orjson-3.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1b130c20b116f413caf6059c651ad32215c28500dce9cd029a334a2d84aa66f"}, {file = "orjson-3.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d31f9a709e6114492136e87c7c6da5e21dfedebefa03af85f3ad72656c493ae9"}, {file = "orjson-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d1d169461726f271ab31633cf0e7e7353417e16fb69256a4f8ecb3246a78d6e"}, {file = "orjson-3.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57c294d73825c6b7f30d11c9e5900cfec9a814893af7f14efbe06b8d0f25fba9"}, {file = "orjson-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d7f11dbacfa9265ec76b4019efffabaabba7a7ebf14078f6b4df9b51c3c9a8ea"}, {file = "orjson-3.10.1-cp312-none-win32.whl", hash = "sha256:d89e5ed68593226c31c76ab4de3e0d35c760bfd3fbf0a74c4b2be1383a1bf123"}, {file = "orjson-3.10.1-cp312-none-win_amd64.whl", hash = "sha256:aa76c4fe147fd162107ce1692c39f7189180cfd3a27cfbc2ab5643422812da8e"}, {file = "orjson-3.10.1-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a2c6a85c92d0e494c1ae117befc93cf8e7bca2075f7fe52e32698da650b2c6d1"}, {file = "orjson-3.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9813f43da955197d36a7365eb99bed42b83680801729ab2487fef305b9ced866"}, {file = "orjson-3.10.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec917b768e2b34b7084cb6c68941f6de5812cc26c6f1a9fecb728e36a3deb9e8"}, {file = "orjson-3.10.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5252146b3172d75c8a6d27ebca59c9ee066ffc5a277050ccec24821e68742fdf"}, {file = "orjson-3.10.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:536429bb02791a199d976118b95014ad66f74c58b7644d21061c54ad284e00f4"}, {file = "orjson-3.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dfed3c3e9b9199fb9c3355b9c7e4649b65f639e50ddf50efdf86b45c6de04b5"}, {file = "orjson-3.10.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2b230ec35f188f003f5b543644ae486b2998f6afa74ee3a98fc8ed2e45960afc"}, {file = "orjson-3.10.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:01234249ba19c6ab1eb0b8be89f13ea21218b2d72d496ef085cfd37e1bae9dd8"}, {file = "orjson-3.10.1-cp38-none-win32.whl", hash = "sha256:8a884fbf81a3cc22d264ba780920d4885442144e6acaa1411921260416ac9a54"}, {file = "orjson-3.10.1-cp38-none-win_amd64.whl", hash = "sha256:dab5f802d52b182163f307d2b1f727d30b1762e1923c64c9c56dd853f9671a49"}, {file = "orjson-3.10.1-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a51fd55d4486bc5293b7a400f9acd55a2dc3b5fc8420d5ffe9b1d6bb1a056a5e"}, {file = "orjson-3.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53521542a6db1411b3bfa1b24ddce18605a3abdc95a28a67b33f9145f26aa8f2"}, {file = "orjson-3.10.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:27d610df96ac18ace4931411d489637d20ab3b8f63562b0531bba16011998db0"}, {file = "orjson-3.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79244b1456e5846d44e9846534bd9e3206712936d026ea8e6a55a7374d2c0694"}, {file = "orjson-3.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d751efaa8a49ae15cbebdda747a62a9ae521126e396fda8143858419f3b03610"}, {file = "orjson-3.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27ff69c620a4fff33267df70cfd21e0097c2a14216e72943bd5414943e376d77"}, {file = "orjson-3.10.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ebc58693464146506fde0c4eb1216ff6d4e40213e61f7d40e2f0dde9b2f21650"}, {file = "orjson-3.10.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5be608c3972ed902e0143a5b8776d81ac1059436915d42defe5c6ae97b3137a4"}, {file = "orjson-3.10.1-cp39-none-win32.whl", hash = "sha256:4ae10753e7511d359405aadcbf96556c86e9dbf3a948d26c2c9f9a150c52b091"}, {file = "orjson-3.10.1-cp39-none-win_amd64.whl", hash = "sha256:fb5bc4caa2c192077fdb02dce4e5ef8639e7f20bec4e3a834346693907362932"}, {file = "orjson-3.10.1.tar.gz", hash = "sha256:a883b28d73370df23ed995c466b4f6c708c1f7a9bdc400fe89165c96c7603204"}, ] [[package]] name = "packaging" version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] name = "pluggy" version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] name = "pygments" version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" version = "2.8.0" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.7" files = [ {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] [package.extras] crypto = ["cryptography (>=3.4.0)"] dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pytest" version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-asyncio" version = "0.21.1" description = "Pytest support for asyncio" optional = false python-versions = ">=3.7" files = [ {file = "pytest-asyncio-0.21.1.tar.gz", hash = "sha256:40a7eae6dded22c7b604986855ea48400ab15b069ae38116e8c01238e9eeb64d"}, {file = "pytest_asyncio-0.21.1-py3-none-any.whl", hash = "sha256:8666c1c8ac02631d7c51ba282e0c69a8a452b211ffedf2599099845da5c5c37b"}, ] [package.dependencies] pytest = ">=7.0.0" [package.extras] docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] [[package]] name = "pytest-cov" version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.8" files = [ {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, ] [package.dependencies] coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.6" files = [ {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] [[package]] name = "requests" version = "2.32.0" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" files = [ {file = "requests-2.32.0-py3-none-any.whl", hash = "sha256:f2c3881dddb70d056c5bd7600a4fae312b2a300e39be6a118d30b90bd27262b5"}, {file = "requests-2.32.0.tar.gz", hash = "sha256:fa5490319474c82ef1d2c9bc459d3652e3ae4ef4c4ebdd18a21145a47ca4b6b8"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "respx" version = "0.20.2" description = "A utility for mocking out the Python HTTPX and HTTP Core libraries." optional = false python-versions = ">=3.7" files = [ {file = "respx-0.20.2-py2.py3-none-any.whl", hash = "sha256:ab8e1cf6da28a5b2dd883ea617f8130f77f676736e6e9e4a25817ad116a172c9"}, {file = "respx-0.20.2.tar.gz", hash = "sha256:07cf4108b1c88b82010f67d3c831dae33a375c7b436e54d87737c7f9f99be643"}, ] [package.dependencies] httpx = ">=0.21.0" [[package]] name = "sniffio" version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." optional = false python-versions = "*" files = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] [[package]] name = "sphinx" version = "7.3.7" description = "Python documentation generator" optional = false python-versions = ">=3.9" files = [ {file = "sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3"}, {file = "sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc"}, ] [package.dependencies] alabaster = ">=0.7.14,<0.8.0" babel = ">=2.9" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} docutils = ">=0.18.1,<0.22" imagesize = ">=1.3" Jinja2 = ">=3.0" packaging = ">=21.0" Pygments = ">=2.14" requests = ">=2.25.0" snowballstemmer = ">=2.0" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" sphinxcontrib-serializinghtml = ">=1.1.9" tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] lint = ["flake8 (>=3.5.0)", "importlib_metadata", "mypy (==1.9.0)", "pytest (>=6.0)", "ruff (==0.3.7)", "sphinx-lint", "tomli", "types-docutils", "types-requests"] test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=6.0)", "setuptools (>=67.0)"] [[package]] name = "sphinx-autodoc-typehints" version = "1.25.3" description = "Type hints (PEP 484) support for the Sphinx autodoc extension" optional = false python-versions = ">=3.8" files = [ {file = "sphinx_autodoc_typehints-1.25.3-py3-none-any.whl", hash = "sha256:d3da7fa9a9761eff6ff09f8b1956ae3090a2d4f4ad54aebcade8e458d6340835"}, {file = "sphinx_autodoc_typehints-1.25.3.tar.gz", hash = "sha256:70db10b391acf4e772019765991d2de0ff30ec0899b9ba137706dc0b3c4835e0"}, ] [package.dependencies] sphinx = ">=7.1.2" [package.extras] docs = ["furo (>=2023.9.10)"] numpy = ["nptyping (>=2.5)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "sphobjinv (>=2.3.1)", "typing-extensions (>=4.8)"] [[package]] name = "sphinx-rtd-theme" version = "2.0.0" description = "Read the Docs theme for Sphinx" optional = false python-versions = ">=3.6" files = [ {file = "sphinx_rtd_theme-2.0.0-py2.py3-none-any.whl", hash = "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586"}, {file = "sphinx_rtd_theme-2.0.0.tar.gz", hash = "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b"}, ] [package.dependencies] docutils = "<0.21" sphinx = ">=5,<8" sphinxcontrib-jquery = ">=4,<5" [package.extras] dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] [[package]] name = "sphinxcontrib-applehelp" version = "1.0.8" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" files = [ {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" version = "1.0.6" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" files = [ {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" version = "2.0.5" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" files = [ {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] [[package]] name = "sphinxcontrib-jquery" version = "4.1" description = "Extension to include jQuery on newer Sphinx releases" optional = false python-versions = ">=2.7" files = [ {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, ] [package.dependencies] Sphinx = ">=1.8" [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" optional = false python-versions = ">=3.5" files = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, ] [package.extras] test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" version = "1.0.7" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" files = [ {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" version = "1.1.10" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" files = [ {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "syrupy" version = "4.6.1" description = "Pytest Snapshot Test Utility" optional = false python-versions = ">=3.8.1,<4" files = [ {file = "syrupy-4.6.1-py3-none-any.whl", hash = "sha256:203e52f9cb9fa749cf683f29bd68f02c16c3bc7e7e5fe8f2fc59bdfe488ce133"}, {file = "syrupy-4.6.1.tar.gz", hash = "sha256:37a835c9ce7857eeef86d62145885e10b3cb9615bc6abeb4ce404b3f18e1bb36"}, ] [package.dependencies] pytest = ">=7.0.0,<9.0.0" [[package]] name = "tenacity" version = "8.2.3" description = "Retry code until it succeeds" optional = false python-versions = ">=3.7" files = [ {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, ] [package.extras] doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.7" files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] [[package]] name = "types-orjson" version = "3.6.2" description = "Typing stubs for orjson" optional = false python-versions = "*" files = [ {file = "types-orjson-3.6.2.tar.gz", hash = "sha256:cf9afcc79a86325c7aff251790338109ed6f6b1bab09d2d4262dd18c85a3c638"}, {file = "types_orjson-3.6.2-py3-none-any.whl", hash = "sha256:22ee9a79236b6b0bfb35a0684eded62ad930a88a56797fa3c449b026cf7dbfe4"}, ] [[package]] name = "typing-extensions" version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] name = "urllib3" version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "zeroconf" version = "0.132.2" description = "A pure python implementation of multicast DNS service discovery" optional = false python-versions = "<4.0,>=3.8" files = [ {file = "zeroconf-0.132.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:31c8406f62251aa62f5b67d865007ffd1dd929eae9027166ffa6bccca69253bd"}, {file = "zeroconf-0.132.2-cp310-cp310-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:d4bc5e43d02e0848c3174914595dfcebed9b74e65cbdfb1011c5082db7916605"}, {file = "zeroconf-0.132.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59953e8445e69e5fee53381c437d3494f7fac8d7b51f0169d59b69eba8f95063"}, {file = "zeroconf-0.132.2-cp310-cp310-manylinux_2_31_x86_64.whl", hash = "sha256:ddae9592604fe04ec065cc53a321844c3592c812988346136d8ee548127f3d12"}, {file = "zeroconf-0.132.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b20036ab22df2fb663f797b110fa82d4798084fcc56c8a264af50989581062be"}, {file = "zeroconf-0.132.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82678a77e471dd3b0ad5ed47a4a42474af3150819718eff7e36dca32ae591949"}, {file = "zeroconf-0.132.2-cp310-cp310-win32.whl", hash = "sha256:390feb3e7fccdffbf66c9bcd895b1db92e501aa2789d6a8b44e6e027ab80ec14"}, {file = "zeroconf-0.132.2-cp310-cp310-win_amd64.whl", hash = "sha256:779d81aac693e57090343ce5b18f477fec993f969aa87660a33e7ce81880ccdf"}, {file = "zeroconf-0.132.2-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:76d12185c335c14b04b8706b4dd0badc16f4185caeb635419c84e575cef7c980"}, {file = "zeroconf-0.132.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:700bae69eb7c45037deef4a729586f32205d391de38802e2ab89151a7a87d1fc"}, {file = "zeroconf-0.132.2-cp311-cp311-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:9d364a929121df5b96af53ac62abdd61fa3a931e74c7a4c80204c961c01a8667"}, {file = "zeroconf-0.132.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e2c398679c863e810a9af2c5d14542a32d438e3bf5ba0b9d8e119326c33303"}, {file = "zeroconf-0.132.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:28b1721617ddc9bf3d2ba3e2b96234f7539e1dbdcacaf6e94ec31ff7b5ebe620"}, {file = "zeroconf-0.132.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f2b26c23efeded0e7fcfd0fb4d638ec4a83d120e1d455267d353090e36479528"}, {file = "zeroconf-0.132.2-cp311-cp311-win32.whl", hash = "sha256:4754dfba1af63545dfd0ab26c834c907e1dd3f94c8ee190c3041a6444313aaed"}, {file = "zeroconf-0.132.2-cp311-cp311-win_amd64.whl", hash = "sha256:db8607a32347da1fd4519cfea441d8b36b44df0c53198ae0471c76fc932a86e0"}, {file = "zeroconf-0.132.2-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:5354c1cf83d36b2d03ee5774923d30fe838f9371963b42ca46ecba45d3507ff4"}, {file = "zeroconf-0.132.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48275e3db89a8d90ff983c3f7b0c6eee2ede3c4e5e75eaf2aa571ea8cb956d95"}, {file = "zeroconf-0.132.2-cp312-cp312-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:3eb0e57654e139c3ef5b6421053236be4a0add9f0301b01545b11a0552c7c123"}, {file = "zeroconf-0.132.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3dd7143dfc37a20f7d1ccf32f916ac78c11d3c8bae61438ee06376b1bc535fc"}, {file = "zeroconf-0.132.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f9a28b0416a36ec32273ee1ac80cc72ff9b06d1cb15a9481dcd5c92bd2bc8f03"}, {file = "zeroconf-0.132.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:06203c23a82b69aca9e961da675600dff19026bb22b5d042f18f9e0ff1139ed3"}, {file = "zeroconf-0.132.2-cp312-cp312-win32.whl", hash = "sha256:5c8c2eeb838538fffaa421f9b3f9c671778886595b5aa0d4ef4d000531e721d2"}, {file = "zeroconf-0.132.2-cp312-cp312-win_amd64.whl", hash = "sha256:a37fe4f302edb8d931a4c386d0944f996e3f54717495636113880c4492ab479f"}, {file = "zeroconf-0.132.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:6732b224be7e69f7c77798e50205f8e92646ab59724151d66d8dc97f92e99a77"}, {file = "zeroconf-0.132.2-cp38-cp38-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:3ad2fe0cbfebe20612c9a5390075a2b3a258a78928f5b7b5163be1699cc528f0"}, {file = "zeroconf-0.132.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56146e66774c30e238088f67be47740ffd4f669c08e76f2e470bd611d7bdae46"}, {file = "zeroconf-0.132.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4dd7d8fdee36cc6bde0bcb08b79375009de7a76d935d1401b6ae4b62505b9ee0"}, {file = "zeroconf-0.132.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a49b13ec79edff347b1e7af65f5843719ca151ef071ac6b2ff564bb69d164331"}, {file = "zeroconf-0.132.2-cp38-cp38-win32.whl", hash = "sha256:ca46637fcc0386fdbe6bde447184ed981499c8c1b5b5fcaa0f35c3b15528162a"}, {file = "zeroconf-0.132.2-cp38-cp38-win_amd64.whl", hash = "sha256:f56ec955f43f944985f857c9d23030362df52e14a7c53c64bf8b29cfadebd601"}, {file = "zeroconf-0.132.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:5586bc773d6cee4f9a14692f5e6bc6387ddb54b2bfae0db01c0695aac20c420a"}, {file = "zeroconf-0.132.2-cp39-cp39-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:1f09b692219abf9b1ca28364d6f4eb283a4c676e30c905933d1694cbd321bc4b"}, {file = "zeroconf-0.132.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1031c7c5f8516108e7c24190179e6a522183de218a954681a341ee818f8079a"}, {file = "zeroconf-0.132.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:87b6e92a869932f4aac3076816a1b987c581b01e49a08e495bef7165be049dfd"}, {file = "zeroconf-0.132.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13beed15eed7e569fd56dbe16c7cb758f81c661d53ec253fbf9cfe7a20e28b7c"}, {file = "zeroconf-0.132.2-cp39-cp39-win32.whl", hash = "sha256:4e83e18722d0bdc2e603f7ca104adf276d5728a664b9e94c99e2d8c02001429c"}, {file = "zeroconf-0.132.2-cp39-cp39-win_amd64.whl", hash = "sha256:a2fa3a89f6a0cf03a56141dad158634a009a22fbe645c7c01e85edc12a0a239f"}, {file = "zeroconf-0.132.2-pp310-pypy310_pp73-macosx_11_0_x86_64.whl", hash = "sha256:1a95025f0949ed0e873e141d482fbbefa223ef90646443e4a1d6d47f50eb89d7"}, {file = "zeroconf-0.132.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:1c932b15848ae6b8e4b2b50c65368e396d000fea95acd473611693dbe5a00096"}, {file = "zeroconf-0.132.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c295b424a271ce5022da83a1274b4cd0f696c5b8e0c190e6a28efde8b36e82d"}, {file = "zeroconf-0.132.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c50ee0df6b0b06f1dad6261670b5be53c909b9a2b1985bcf65ea5b0d766fd10e"}, {file = "zeroconf-0.132.2-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5b6cfc2b62e6282eabbcb6c7223b0a8c05ed3a326e7b467d06b85a3eeda1bfc8"}, {file = "zeroconf-0.132.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:d6c05af8b49c442422ce49565ab41a094b23e0f5692abe1533428cbe35a78f8e"}, {file = "zeroconf-0.132.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b0d2ffc4bafbcc4152067bfbc1a67074d23e6100e356424bd985ca8067a2bfd"}, {file = "zeroconf-0.132.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b60b260c70bb77d7f3b666bdd2a2a74cead5e36814f8b4295778bcdd08f65c7e"}, {file = "zeroconf-0.132.2-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:9228c512334905338f65825102e47778e5ce034bb4249c3deb22991826ed061f"}, {file = "zeroconf-0.132.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:e36f50a963d149bb7152543db9bdbd73f7997e66b57b7956fc17751f55e59625"}, {file = "zeroconf-0.132.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bd0cd9435dced8c31491b3ed7c15707acedd11f00451f7fbb57ba3868dd5724"}, {file = "zeroconf-0.132.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d80bde641349198c8c17684692a8cc40a36a93c0cebd8f1d7c42db7ceeaa17be"}, {file = "zeroconf-0.132.2.tar.gz", hash = "sha256:9ad8bc6e3f168fe8c164634c762d3265c775643defff10e26273623a12d73ae1"}, ] [package.dependencies] async-timeout = {version = ">=3.0.0", markers = "python_version < \"3.11\""} ifaddr = ">=0.1.7" [metadata] lock-version = "2.0" python-versions = "^3.10" content-hash = "f0cf4b7a94d06138e425d806c2861ae529680f77e4d74ced48d85d29afdbd9f6" pyenphase-pyenphase-1bfa6dd/pyproject.toml000066400000000000000000000045561464551303400212040ustar00rootroot00000000000000[tool.poetry] name = "pyenphase" version = "1.21.0" description = "Library to control enphase envoy" authors = ["pyenphase "] license = "MIT" readme = "README.md" repository = "https://github.com/pyenphase/pyenphase" documentation = "https://pyenphase.readthedocs.io" classifiers = [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "Natural Language :: English", "Operating System :: OS Independent", "Topic :: Software Development :: Libraries", ] packages = [ { include = "pyenphase", from = "src" }, ] [tool.poetry.urls] "Bug Tracker" = "https://github.com/pyenphase/pyenphase/issues" "Changelog" = "https://github.com/pyenphase/pyenphase/blob/main/CHANGELOG.md" [tool.poetry.dependencies] python = "^3.10" httpx = ">=0.24.0" lxml = ">=4.9.2" pyjwt = ">=2.7.0" awesomeversion = ">=22.9.0" tenacity = "^8.2.2" envoy-utils = ">=0.0.1" orjson = ">=3.9.2" [tool.poetry.group.dev.dependencies] pytest = "^7.0" pytest-cov = "^5.0" types-orjson = "^3.6.2" respx = "^0.20.2" pytest-asyncio = "^0.21.1" syrupy = "^4.5.0" [tool.poetry.group.docs] optional = true [tool.poetry.group.docs.dependencies] myst-parser = ">=0.16" sphinx = ">=4.0" sphinx-rtd-theme = ">=1.0" sphinx-autodoc-typehints = "^1.25.2" [tool.semantic_release] branch = "main" version_toml = "pyproject.toml:tool.poetry.version" version_variable = "src/pyenphase/__init__.py:__version__" build_command = "pip install poetry && poetry build" [tool.pytest.ini_options] addopts = "-v -Wdefault --cov=pyenphase --cov-report=term-missing:skip-covered" pythonpath = ["src"] [tool.coverage.run] branch = true [tool.coverage.report] exclude_lines = [ "pragma: no cover", "@overload", "if TYPE_CHECKING", "raise NotImplementedError", 'if __name__ == "__main__":', ] [tool.isort] profile = "black" known_first_party = ["pyenphase", "tests"] [tool.mypy] check_untyped_defs = true disallow_any_generics = true disallow_incomplete_defs = true disallow_untyped_defs = true mypy_path = "src/" no_implicit_optional = true show_error_codes = true warn_unreachable = true warn_unused_ignores = true exclude = [ 'docs/.*', 'setup.py', ] [[tool.mypy.overrides]] module = "tests.*" allow_untyped_defs = true [[tool.mypy.overrides]] module = "docs.*" ignore_errors = true [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" pyenphase-pyenphase-1bfa6dd/renovate.json000066400000000000000000000001011464551303400207640ustar00rootroot00000000000000{ "extends": ["github>browniebroke/renovate-configs:python"] } pyenphase-pyenphase-1bfa6dd/script/000077500000000000000000000000001464551303400175625ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/script/setup000077500000000000000000000002011464551303400206410ustar00rootroot00000000000000#!/bin/sh set -e # Install all dependencies: pip3 install poetry poetry install # Install pre-commit hooks: pre-commit install pyenphase-pyenphase-1bfa6dd/setup.py000066400000000000000000000003571464551303400177750ustar00rootroot00000000000000#!/usr/bin/env python # This is a shim to allow GitHub to detect the package, build is done with poetry # Taken from https://github.com/Textualize/rich import setuptools if __name__ == "__main__": setuptools.setup(name="pyenphase") pyenphase-pyenphase-1bfa6dd/src/000077500000000000000000000000001464551303400170455ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/src/pyenphase/000077500000000000000000000000001464551303400210415ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/src/pyenphase/__init__.py000066400000000000000000000025151464551303400231550ustar00rootroot00000000000000"""Python wrapper for Enphase Envoy API.""" from .auth import EnvoyTokenAuth from .envoy import AUTH_TOKEN_MIN_VERSION, Envoy, register_updater from .exceptions import ( EnvoyAuthenticationError, EnvoyAuthenticationRequired, EnvoyCommunicationError, EnvoyError, EnvoyFirmwareCheckError, EnvoyFirmwareFatalCheckError, EnvoyProbeFailed, ) from .models.dry_contacts import EnvoyDryContactSettings, EnvoyDryContactStatus from .models.encharge import EnvoyEncharge, EnvoyEnchargeAggregate, EnvoyEnchargePower from .models.enpower import EnvoyEnpower from .models.envoy import EnvoyData from .models.inverter import EnvoyInverter from .models.system_consumption import EnvoySystemConsumption from .models.system_production import EnvoySystemProduction __all__ = ( AUTH_TOKEN_MIN_VERSION, "register_updater", "Envoy", "EnvoyData", "EnvoyTokenAuth", "EnvoyError", "EnvoyCommunicationError", "EnvoyFirmwareCheckError", "EnvoyFirmwareFatalCheckError", "EnvoyAuthenticationError", "EnvoyAuthenticationRequired", "EnvoyProbeFailed", "EnvoyInverter", "EnvoySystemConsumption", "EnvoySystemProduction", "EnvoyEncharge", "EnvoyEnchargeAggregate", "EnvoyEnchargePower", "EnvoyEnpower", "EnvoyDryContactSettings", "EnvoyDryContactStatus", "EnvoyTariff", ) pyenphase-pyenphase-1bfa6dd/src/pyenphase/auth.py000066400000000000000000000210211464551303400223500ustar00rootroot00000000000000"""Envoy authentication methods.""" from abc import abstractmethod, abstractproperty from typing import Any, cast import httpx import jwt import orjson from tenacity import retry, retry_if_exception_type, wait_random_exponential from .const import LOCAL_TIMEOUT, URL_AUTH_CHECK_JWT from .exceptions import EnvoyAuthenticationError from .ssl import SSL_CONTEXT class EnvoyAuth: """Base class for Envoy authentication.""" def __init__(self, host: str) -> None: """Initialize the EnvoyAuth class.""" @abstractmethod async def setup(self, client: httpx.AsyncClient) -> None: """Obtain the token for Envoy authentication.""" @abstractproperty def cookies(self) -> dict[str, str]: """Return the Envoy cookie.""" @abstractproperty def auth(self) -> httpx.DigestAuth | None: """Return the httpx auth object.""" @abstractproperty def headers(self) -> dict[str, str]: """Return the auth headers.""" @abstractmethod def get_endpoint_url(self, endpoint: str) -> str: """Return the URL for the endpoint.""" class EnvoyTokenAuth(EnvoyAuth): JSON_LOGIN_URL = "https://enlighten.enphaseenergy.com/login/login.json?" TOKEN_URL = "https://entrez.enphaseenergy.com/tokens" # nosec def __init__( self, host: str, cloud_username: str | None = None, cloud_password: str | None = None, envoy_serial: str | None = None, token: str | None = None, ) -> None: self.host = host self.cloud_username = cloud_username self.cloud_password = cloud_password self.envoy_serial = envoy_serial self._token = token self._is_consumer: bool = False self._manager_token: str = "" self._cookies: dict[str, str] = {} async def setup(self, client: httpx.AsyncClient) -> None: """Obtain the token for Envoy authentication.""" if not self._token: self._token = await self._obtain_token() # Verify we have adequate credentials if not self._token: raise EnvoyAuthenticationError( "Unable to obtain token for Envoy authentication." ) await self._check_jwt(client) @retry( retry=retry_if_exception_type(httpx.HTTPError), wait=wait_random_exponential(multiplier=2, max=3), ) async def _check_jwt(self, client: httpx.AsyncClient) -> None: """Check the JWT token for Envoy authentication.""" req = await client.get( f"https://{self.host}{URL_AUTH_CHECK_JWT}", headers={"Authorization": f"Bearer {self.token}"}, timeout=LOCAL_TIMEOUT, ) if req.status_code == 200: self._cookies = req.cookies return raise EnvoyAuthenticationError( "Unable to verify token for Envoy authentication." ) async def _obtain_token(self) -> str: """Obtain the token for Envoy authentication.""" # Raise if we don't have cloud credentials if not self.cloud_username or not self.cloud_password: raise EnvoyAuthenticationError( "Your firmware requires token authentication, " " but no cloud credentials were provided to obtain the token." ) # Raise if we are missing the envoy serial number if not self.envoy_serial: raise EnvoyAuthenticationError( "Your firmware requires token authentication, " "but no envoy serial number was provided to obtain the token." ) # We require a new client that checks SSL certs async with httpx.AsyncClient( verify=SSL_CONTEXT, timeout=10, follow_redirects=True ) as cloud_client: # Login to Enlighten to obtain a session ID response = await self._post_json_with_cloud_client( cloud_client, self.JSON_LOGIN_URL, data={ "user[email]": self.cloud_username, "user[password]": self.cloud_password, }, ) if response.status_code != 200: raise EnvoyAuthenticationError( "Unable to login to Enlighten to obtain session ID from " f"{self.JSON_LOGIN_URL}: " f"{response.status_code}: {response.text}" ) try: response = orjson.loads(response.text) except orjson.JSONDecodeError as err: raise EnvoyAuthenticationError( "Unable to decode response from Enlighten: " f"{response.status_code}: {response.text}" ) from err self._is_consumer = response["is_consumer"] self._manager_token = response["manager_token"] # Obtain the token response = await self._post_json_with_cloud_client( cloud_client, self.TOKEN_URL, json={ "session_id": response["session_id"], "serial_num": self.envoy_serial, "username": self.cloud_username, }, ) if response.status_code != 200: raise EnvoyAuthenticationError( "Unable to obtain token for Envoy authentication from " f"{self.TOKEN_URL}: " f"{response.status_code}: {response.text}" ) return response.text async def refresh(self) -> None: """Refresh the token for Envoy authentication.""" self._token = await self._obtain_token() @property def expire_timestamp(self) -> int: """Return the remaining seconds for the token.""" jwt_payload = jwt.decode(self.token, options={"verify_signature": False}) return cast(int, jwt_payload["exp"]) @retry( retry=retry_if_exception_type( (httpx.NetworkError, httpx.TimeoutException, httpx.RemoteProtocolError) ), wait=wait_random_exponential(multiplier=2, max=3), ) async def _post_json_with_cloud_client( self, cloud_client: httpx.AsyncClient, url: str, data: dict[str, Any] | None = None, json: dict[str, Any] | None = None, ) -> httpx.Response: """Post to the Envoy API with the cloud client.""" return await cloud_client.post(url, json=json, data=data) @property def token(self) -> str: """Return token retrieved from enligthen""" assert self._token is not None # nosec return self._token @property def manager_token(self) -> str: """Return manager token returned in enligthen login json""" assert self._manager_token is not None # nosec return self._manager_token @property def cookies(self) -> dict[str, str]: """return cookies returned from local jwt check""" return self._cookies @property def is_consumer(self) -> bool: """Return is_consumer state returned in enligthen login json""" return self._is_consumer @property def auth(self) -> None: """No auth required for token authentication.""" return None @property def headers(self) -> dict[str, str]: """Return the headers for Envoy authentication.""" return {"Authorization": f"Bearer {self.token}"} def get_endpoint_url(self, endpoint: str) -> str: """Return the URL for the endpoint.""" return f"https://{self.host}{endpoint}" class EnvoyLegacyAuth(EnvoyAuth): """Class for legacy Envoy authentication.""" def __init__(self, host: str, username: str, password: str) -> None: self.host = host self.local_username = username self.local_password = password @property def auth(self) -> httpx.DigestAuth: """Digest authentication for local Envoy.""" if not self.local_username or not self.local_password: return None return httpx.DigestAuth(self.local_username, self.local_password) async def setup(self, client: httpx.AsyncClient) -> None: """Setup auth""" # No setup required for legacy authentication @property def headers(self) -> dict[str, str]: """Return the headers for legacy Envoy authentication.""" return {} def get_endpoint_url(self, endpoint: str) -> str: """Return the URL for the endpoint.""" return f"http://{self.host}{endpoint}" @property def cookies(self) -> dict[str, str]: return {} pyenphase-pyenphase-1bfa6dd/src/pyenphase/const.py000066400000000000000000000045661464551303400225540ustar00rootroot00000000000000import enum import httpx from awesomeversion import AwesomeVersion # Versions LEGACY_ENVOY_VERSION = AwesomeVersion("3.9.0") ENSEMBLE_MIN_VERSION = AwesomeVersion("5.0.0") AUTH_TOKEN_MIN_VERSION = AwesomeVersion("7.0.0") # System Production URL_PRODUCTION_INVERTERS = "/api/v1/production/inverters" URL_PRODUCTION_V1 = "/api/v1/production" URL_PRODUCTION_JSON = "/production.json?details=1" URL_PRODUCTION = "/production" # Authentication URL_AUTH_CHECK_JWT = "/auth/check_jwt" # Battery and Enpower Status URL_DRY_CONTACT_STATUS = "/ivp/ensemble/dry_contacts" URL_DRY_CONTACT_SETTINGS = "/ivp/ss/dry_contact_settings" URL_ENSEMBLE_INVENTORY = "/ivp/ensemble/inventory" URL_ENSEMBLE_STATUS = "/ivp/ensemble/status" URL_ENSEMBLE_SECCTRL = "/ivp/ensemble/secctrl" URL_ENCHARGE_BATTERY = "/ivp/ensemble/power" URL_GRID_RELAY = "/ivp/ensemble/relay" URL_POWER_EXPORT = "/uvp/ss/pel_settings" URL_TARIFF = "/admin/lib/tariff" # Generator Configuration URL_GEN_CONFIG = "/ivp/ss/gen_config" URL_GEN_MODE = "/ivp/ss/gen_mode" URL_GEN_SCHEDULE = "/ivp/ss/gen_schedule" # Meters data ENDPOINT_URL_METERS = "/ivp/meters" ENDPOINT_URL_METERS_READINGS = "/ivp/meters/readings" LOCAL_TIMEOUT = httpx.Timeout( # The envoy can be slow to respond but fast to connect to we # need to set a long timeout for the read and a short timeout # for the connect timeout=10.0, read=45.0, ) # Requests should no longer retry after max delay (sec) or times since first try MAX_REQUEST_DELAY = 50 MAX_REQUEST_ATTEMPTS = 4 class SupportedFeatures(enum.IntFlag): """Features available from Envoy""" INVERTERS = 1 #: Envoy reports inverters METERING = 2 #: Envoy reports active production meter TOTAL_CONSUMPTION = 4 #: Envoy reports total consumption NET_CONSUMPTION = 8 #: Envoy reports net consumption ENCHARGE = 16 #: Envoy reports encharge data ENPOWER = 32 #: Envoy reports Enpower data PRODUCTION = 64 #: Envoy reports production data TARIFF = 128 #: Envoy reports tariff information DUALPHASE = 256 #: Envoy metered is configured in split phase mode THREEPHASE = 512 #: Envoy metered is configured in three phase mode CTMETERS = 1024 #: Envoy has enabled CT meter(s) GENERATOR = 2048 #: Envoy reports generator data class PhaseNames(enum.StrEnum): PHASE_1 = "L1" PHASE_2 = "L2" PHASE_3 = "L3" PHASENAMES: list[str] = list(PhaseNames) pyenphase-pyenphase-1bfa6dd/src/pyenphase/envoy.py000066400000000000000000000561351464551303400225650ustar00rootroot00000000000000import logging import time from collections.abc import Awaitable, Callable from dataclasses import replace from functools import cached_property, partial from http import HTTPStatus from typing import TYPE_CHECKING, Any import httpx import orjson from anyio import EndOfStream from awesomeversion import AwesomeVersion from envoy_utils.envoy_utils import EnvoyUtils from tenacity import ( retry, retry_if_exception_type, stop_after_attempt, stop_after_delay, wait_random_exponential, ) from pyenphase.models.dry_contacts import DryContactStatus from .auth import EnvoyAuth, EnvoyLegacyAuth, EnvoyTokenAuth from .const import ( AUTH_TOKEN_MIN_VERSION, LOCAL_TIMEOUT, MAX_REQUEST_ATTEMPTS, MAX_REQUEST_DELAY, URL_DRY_CONTACT_SETTINGS, URL_DRY_CONTACT_STATUS, URL_GRID_RELAY, URL_TARIFF, SupportedFeatures, ) from .exceptions import ( EnvoyAuthenticationRequired, EnvoyCommunicationError, EnvoyFeatureNotAvailable, EnvoyPoorDataQuality, EnvoyProbeFailed, ) from .firmware import EnvoyFirmware from .json import json_loads from .models.common import CommonProperties from .models.envoy import EnvoyData from .models.meters import CtType, EnvoyPhaseMode from .models.tariff import EnvoyStorageMode from .ssl import NO_VERIFY_SSL_CONTEXT from .updaters.api_v1_production import EnvoyApiV1ProductionUpdater from .updaters.api_v1_production_inverters import EnvoyApiV1ProductionInvertersUpdater from .updaters.base import EnvoyUpdater from .updaters.ensemble import EnvoyEnembleUpdater from .updaters.generator import EnvoyGeneratorUpdater from .updaters.meters import EnvoyMetersUpdater from .updaters.production import ( EnvoyProductionJsonFallbackUpdater, EnvoyProductionJsonUpdater, EnvoyProductionUpdater, ) from .updaters.tariff import EnvoyTariffUpdater _LOGGER = logging.getLogger(__name__) DEFAULT_HEADERS = { "Accept": "application/json", } UPDATERS: list[type["EnvoyUpdater"]] = [ EnvoyMetersUpdater, EnvoyProductionJsonUpdater, EnvoyProductionUpdater, EnvoyApiV1ProductionUpdater, EnvoyProductionJsonFallbackUpdater, EnvoyApiV1ProductionInvertersUpdater, EnvoyEnembleUpdater, EnvoyTariffUpdater, EnvoyGeneratorUpdater, ] def register_updater(updater: type[EnvoyUpdater]) -> Callable[[], None]: """Register an updater.""" UPDATERS.append(updater) def _remove_updater() -> None: UPDATERS.remove(updater) return _remove_updater def get_updaters() -> list[type[EnvoyUpdater]]: return UPDATERS class Envoy: """Class for communicating with an envoy.""" def __init__( self, host: str, client: httpx.AsyncClient | None = None, timeout: float | httpx.Timeout | None = None, ) -> None: """Initialize the Envoy class.""" # We use our own httpx client session so we can disable SSL verification (Envoys use self-signed SSL certs) self._timeout = timeout or LOCAL_TIMEOUT self._client = client or httpx.AsyncClient( verify=NO_VERIFY_SSL_CONTEXT ) # nosec self.auth: EnvoyAuth | None = None self._host = host self._firmware = EnvoyFirmware(self._client, self._host) self._supported_features: SupportedFeatures | None = None self._updaters: list[EnvoyUpdater] = [] self._endpoint_cache: dict[str, httpx.Response] = {} self.data: EnvoyData | None = None self._common_properties: CommonProperties = CommonProperties() async def setup(self) -> None: """Obtain the firmware version for later Envoy authentication.""" await self._firmware.setup() async def authenticate( self, username: str | None = None, password: str | None = None, token: str | None = None, ) -> None: """Authenticate to the Envoy based on firmware version.""" if self._firmware.version < AUTH_TOKEN_MIN_VERSION: # Envoy firmware using old envoy/installer authentication _LOGGER.debug( "FW: %s, Authenticating to Envoy using envoy/installer authentication", self._firmware.version, ) full_serial = self._firmware.serial if not username or username == "installer": username = "installer" password = EnvoyUtils.get_password(full_serial, username) elif username == "envoy" and not password: # The default password for the envoy user is the last 6 digits of the serial number assert full_serial is not None, "Serial must be set" # nosec password = full_serial[-6:] if username and password: self.auth = EnvoyLegacyAuth(self.host, username, password) else: # Envoy firmware using new token authentication _LOGGER.debug( "FW: %s, Authenticating to Envoy using token authentication", self._firmware.version, ) if token or (username and password): # Always pass all the data to the token auth class, even if some of it is None # so that we can refresh the token if needed self.auth = EnvoyTokenAuth( self.host, cloud_username=username, cloud_password=password, envoy_serial=self._firmware.serial, token=token, ) if not self.auth: _LOGGER.error( "You must include username/password or token to authenticate to the Envoy." ) raise EnvoyAuthenticationRequired("Could not setup authentication object.") await self.auth.setup(self._client) @retry( retry=retry_if_exception_type( ( httpx.NetworkError, httpx.TimeoutException, httpx.RemoteProtocolError, ) ), wait=wait_random_exponential(multiplier=2, max=5), stop=stop_after_delay(MAX_REQUEST_DELAY) | stop_after_attempt(MAX_REQUEST_ATTEMPTS), reraise=True, ) async def probe_request(self, endpoint: str) -> httpx.Response: """Make a probe request. Probe requests are not retried on bad JSON responses. """ return await self._request(endpoint) @retry( retry=retry_if_exception_type( ( httpx.NetworkError, httpx.TimeoutException, httpx.RemoteProtocolError, orjson.JSONDecodeError, ) ), wait=wait_random_exponential(multiplier=2, max=5), stop=stop_after_delay(MAX_REQUEST_DELAY) | stop_after_attempt(MAX_REQUEST_ATTEMPTS), reraise=True, ) async def request( self, endpoint: str, data: dict[str, Any] | None = None ) -> httpx.Response: """Make a request to the Envoy. Request retries on bad JSON responses which the Envoy sometimes returns. """ return await self._request(endpoint, data) async def _request( self, endpoint: str, data: dict[str, Any] | None = None, method: str | None = None, ) -> httpx.Response: """Make a request to the Envoy.""" if self.auth is None: raise EnvoyAuthenticationRequired( "You must authenticate to the Envoy before making requests." ) url = self.auth.get_endpoint_url(endpoint) debugon = _LOGGER.isEnabledFor(logging.DEBUG) if debugon: request_start = time.monotonic() if data: if debugon: _LOGGER.debug( "Sending POST to %s with data %s", url, orjson.dumps(data) ) response = await self._client.request( method if method else "POST", url, headers={**DEFAULT_HEADERS, **self.auth.headers}, follow_redirects=True, auth=self.auth.auth, timeout=self._timeout, content=orjson.dumps(data), ) else: _LOGGER.debug("Requesting %s with timeout %s", url, self._timeout) response = await self._client.get( url, headers={**DEFAULT_HEADERS, **self.auth.headers}, follow_redirects=True, auth=self.auth.auth, timeout=self._timeout, ) status_code = response.status_code if status_code in (HTTPStatus.UNAUTHORIZED, HTTPStatus.FORBIDDEN): raise EnvoyAuthenticationRequired( f"Authentication failed for {url} with status {status_code}, " "please check your username/password or token." ) # show all responses centrally when in debug if debugon: request_end = time.monotonic() content_type = response.headers.get("content-type") content = response.content _LOGGER.debug( "Request reply in %s sec from %s status %s: %s %s", round(request_end - request_start, 1), url, status_code, content_type, content, ) return response @property def host(self) -> str: """Return the Envoy host.""" return self._host @property def firmware(self) -> AwesomeVersion: """Return the Envoy firmware version.""" return self._firmware.version @property def part_number(self) -> str | None: """Return the Envoy part number.""" return self._firmware.part_number @property def serial_number(self) -> str | None: """Return the Envoy serial number.""" return self._firmware.serial @property def supported_features(self) -> SupportedFeatures: """Return the supported features.""" assert self._supported_features is not None, "Call setup() first" # nosec return self._supported_features @property def phase_count(self) -> int: """Return the number of configured phases for CT meters.""" assert self._common_properties is not None, "Call setup() first" # nosec return self._common_properties.phase_count @property def active_phase_count(self) -> int: """Return the number of phases reported in production/consumption report.""" assert self._common_properties is not None, "Call setup() first" # nosec return self._common_properties.active_phase_count @property def ct_meter_count(self) -> int: """Return the number of configured current transformers (CT)""" assert self._common_properties is not None, "Call setup() first" # nosec return self._common_properties.ct_meter_count @property def consumption_meter_type(self) -> CtType | None: """Return the type of consumption ct meter installed (total or net consumption or None).""" assert self._common_properties is not None, "Call setup() first" # nosec return self._common_properties.consumption_meter_type @property def production_meter_type(self) -> CtType | None: """Return the type of production ct meter installed (Production or None).""" assert self._common_properties is not None, "Call setup() first" # nosec return self._common_properties.production_meter_type @property def storage_meter_type(self) -> CtType | None: """Return the type of storage ct meter installed (Storage or None).""" assert self._common_properties is not None, "Call setup() first" # nosec return self._common_properties.storage_meter_type @property def phase_mode(self) -> EnvoyPhaseMode | None: """Return the phase mode configured for the CT meters (single, split or three).""" assert self._common_properties is not None, "Call setup() first" # nosec return self._common_properties.phase_mode @cached_property def envoy_model(self) -> str: """Return Envoy model description.""" model = "Envoy" # if CT and more then 1 phase add phase count to model ct_count = self.ct_meter_count phase_count = self.phase_count if phase_count > 1 or ct_count > 0: model = f"{model}, phases: {phase_count}" # Add phase mode to model phase_mode = self.phase_mode model = f"{model}, phase mode: {phase_mode}" # if consumption CT type is known add to model if ct_consumption_meter := self.consumption_meter_type: model = f"{model}, {ct_consumption_meter} CT" # if production CT is found add to model. if ct_production_meter := self.production_meter_type: model = f"{model}, {ct_production_meter} CT" # if storage CT is found add to model. if ct_storage_meter := self.storage_meter_type: model = f"{model}, {ct_storage_meter} CT" return model async def _make_cached_request( self, request_func: Callable[[str], Awaitable[httpx.Response]], endpoint: str ) -> httpx.Response: """Make a cached request.""" if cached_response := self._endpoint_cache.get(endpoint): return cached_response response = await request_func(endpoint) if response.status_code == 200: self._endpoint_cache[endpoint] = response return response async def probe(self) -> None: """Probe for model and supported features.""" supported_features = SupportedFeatures(0) updaters: list[EnvoyUpdater] = [] version = self._firmware.version self._endpoint_cache.clear() cached_probe = partial(self._make_cached_request, self.probe_request) cached_request = partial(self._make_cached_request, self.request) self._common_properties.reset_probe_properties() for updater in get_updaters(): klass = updater( version, cached_probe, cached_request, self._common_properties ) if updater_features := await klass.probe(supported_features): supported_features |= updater_features updaters.append(klass) if not supported_features & SupportedFeatures.PRODUCTION: raise EnvoyProbeFailed("Unable to determine production endpoint") self._updaters = updaters self._supported_features = supported_features def _validate_update(self, data: EnvoyData) -> None: """Perform some overall validation checks and raise for issues.""" if self._firmware.version.major == "3" and data.system_production: # FW R3.x will return status 200 with all zeros right after startup # where never versions return status 503 to signal not ready yet # raise error to avoid inserting zero's in historical series. production = data.system_production if ( production.watts_now + production.watt_hours_today + production.watt_hours_last_7_days + production.watt_hours_lifetime ) == 0: raise EnvoyPoorDataQuality( "Data rejected on rule: " f"FW 3.x production all zero at startup ({self._firmware.version})." ) async def update(self) -> EnvoyData: """Update data.""" # Some of the updaters user the same endpoint # so we cache the 200 responses for each update # cycle to not make duplicate requests self._endpoint_cache.clear() if not self._supported_features: await self.probe() data = EnvoyData() for updater in self._updaters: try: await updater.update(data) except EndOfStream as err: raise EnvoyCommunicationError("EndOfStream at update") from err except httpx.NetworkError as err: raise EnvoyCommunicationError(f"HTTPX NetworkError {str(err)}") from err except httpx.TimeoutException as err: raise EnvoyCommunicationError(f"HTTPX Timeout {str(err)}") from err self._validate_update(data) self.data = data return data async def _json_request( self, end_point: str, data: dict[str, Any] | None, method: str | None = None ) -> Any: """Make a request to the Envoy and return the JSON response.""" response = await self._request(end_point, data, method) return json_loads(end_point, response.content) async def go_on_grid(self) -> dict[str, Any]: """Make a request to the Envoy to go on grid.""" if not self.supported_features & SupportedFeatures.ENPOWER: raise EnvoyFeatureNotAvailable( "This feature is not available on this Envoy." ) return await self._json_request(URL_GRID_RELAY, {"mains_admin_state": "closed"}) async def go_off_grid(self) -> dict[str, Any]: """Make a request to the Envoy to go off grid.""" if not self.supported_features & SupportedFeatures.ENPOWER: raise EnvoyFeatureNotAvailable( "This feature is not available on this Envoy." ) return await self._json_request(URL_GRID_RELAY, {"mains_admin_state": "open"}) async def update_dry_contact(self, new_data: dict[str, Any]) -> dict[str, Any]: """Update settings for an Enpower dry contact relay.""" # All settings for the relay must be sent in the POST or it may crash the Envoy if not self.supported_features & SupportedFeatures.ENPOWER: raise EnvoyFeatureNotAvailable( "This feature is not available on this Envoy." ) if not (id_ := new_data.get("id")): raise ValueError("You must specify the dry contact ID in the data object.") # Get the current settings for the relay from EnvoyData and merge with the new settings if not (current_data := self.data): raise ValueError( "Tried to set dry contact settings before the Envoy was queried." ) current_model = current_data.dry_contact_settings[id_] new_model = replace(current_model, **new_data) return await self._json_request( URL_DRY_CONTACT_SETTINGS, {"dry_contacts": new_model.to_api()} ) async def open_dry_contact(self, id: str) -> dict[str, Any]: """Open a dry contact relay.""" if not self.supported_features & SupportedFeatures.ENPOWER: raise EnvoyFeatureNotAvailable( "This feature is not available on this Envoy." ) result = await self._json_request( URL_DRY_CONTACT_STATUS, {"dry_contacts": {"id": id, "status": "open"}} ) # The Envoy takes a few seconds before it will reflect the new state of the relay # so we preemptively update it if TYPE_CHECKING: assert self.data is not None # nosec self.data.dry_contact_status[id].status = DryContactStatus.OPEN return result async def close_dry_contact(self, id: str) -> dict[str, Any]: """Open a dry contact relay.""" if not self.supported_features & SupportedFeatures.ENPOWER: raise EnvoyFeatureNotAvailable( "This feature is not available on this Envoy." ) result = await self._json_request( URL_DRY_CONTACT_STATUS, {"dry_contacts": {"id": id, "status": "closed"}} ) # The Envoy takes a few seconds before it will reflect the new state of the relay # so we preemptively update it if TYPE_CHECKING: assert self.data is not None # nosec self.data.dry_contact_status[id].status = DryContactStatus.CLOSED return result async def enable_charge_from_grid(self) -> dict[str, Any]: """Enable charge from grid for Encharge batteries.""" self._verify_tariff_storage_or_raise() if TYPE_CHECKING: assert self.data is not None # nosec assert self.data.tariff is not None # nosec assert self.data.tariff.storage_settings is not None # nosec self.data.tariff.storage_settings.charge_from_grid = True return await self._json_request( URL_TARIFF, {"tariff": self.data.tariff.to_api()}, method="PUT" ) async def disable_charge_from_grid(self) -> dict[str, Any]: """Disable charge from grid for Encharge batteries.""" self._verify_tariff_storage_or_raise() if TYPE_CHECKING: assert self.data is not None # nosec assert self.data.tariff is not None # nosec assert self.data.tariff.storage_settings is not None # nosec self.data.tariff.storage_settings.charge_from_grid = False return await self._json_request( URL_TARIFF, {"tariff": self.data.tariff.to_api()}, method="PUT" ) async def set_storage_mode(self, mode: EnvoyStorageMode) -> dict[str, Any]: """Set the Encharge storage mode.""" self._verify_tariff_storage_or_raise() if TYPE_CHECKING: assert self.data is not None # nosec assert self.data.tariff is not None # nosec assert self.data.tariff.storage_settings is not None # nosec if type(mode) is not EnvoyStorageMode: raise TypeError("Mode must be of type EnvoyStorageMode") self.data.tariff.storage_settings.mode = mode return await self._json_request( URL_TARIFF, {"tariff": self.data.tariff.to_api()}, method="PUT" ) async def set_reserve_soc(self, value: int) -> dict[str, Any]: """Set the Encharge reserve state of charge.""" self._verify_tariff_storage_or_raise() if TYPE_CHECKING: assert self.data is not None # nosec assert self.data.tariff is not None # nosec assert self.data.tariff.storage_settings is not None # nosec self.data.tariff.storage_settings.reserved_soc = round(float(value), 1) return await self._json_request( URL_TARIFF, {"tariff": self.data.tariff.to_api()}, method="PUT" ) def _verify_tariff_storage_or_raise(self) -> None: if not self.supported_features & SupportedFeatures.ENCHARGE: raise EnvoyFeatureNotAvailable( "This feature requires Enphase Encharge or IQ Batteries." ) if not self.supported_features & SupportedFeatures.TARIFF: raise EnvoyFeatureNotAvailable( "This feature is not available on this Envoy." ) if not self.data: raise ValueError("Tried access envoy data before Envoy was queried.") if TYPE_CHECKING: assert self.data is not None # nosec if not self.data.tariff: raise ValueError( "Tried to configure charge from grid before the Envoy was queried." ) if TYPE_CHECKING: assert self.data.tariff is not None # nosec if not self.data.tariff.storage_settings: raise EnvoyFeatureNotAvailable( "This feature requires Enphase Encharge or IQ Batteries." ) pyenphase-pyenphase-1bfa6dd/src/pyenphase/exceptions.py000066400000000000000000000035551464551303400236040ustar00rootroot00000000000000import json import httpx class EnvoyError(Exception): """Base class for Envoy exceptions.""" class EnvoyFirmwareCheckError(EnvoyError): """Exception raised when unable to query the Envoy firmware version.""" def __init__(self, status_code: int, status: str) -> None: self.status_code = status_code self.status = status class EnvoyFirmwareFatalCheckError(EnvoyError): """Exception raised when we should not retry the Envoy firmware version.""" def __init__(self, status_code: int, status: str) -> None: self.status_code = status_code self.status = status class EnvoyAuthenticationError(EnvoyError): """Exception raised when unable to query the Envoy firmware version.""" def __init__(self, status: str) -> None: self.status = status class EnvoyAuthenticationRequired(EnvoyError): """Exception raised when authentication hasn't been setup.""" def __init__(self, status: str) -> None: self.status = status class EnvoyHTTPStatusError(EnvoyError): """Exception raised when unable to query the Envoy status.""" def __init__(self, status_code: int, url: str) -> None: self.status_code = status_code self.url = url super().__init__(f"HTTP status error {url} {status_code}") class EnvoyProbeFailed(EnvoyError): """Exception raised when the Envoy probe fails.""" class EnvoyCommunicationError(EnvoyError): """Exception raised when the Envoy communication fails.""" class EnvoyFeatureNotAvailable(EnvoyError): """Exception raised when the Envoy feature is not available.""" class EnvoyPoorDataQuality(EnvoyError): """Exception raised when data identifies known issues.""" def __init__(self, status: str) -> None: self.status = status ENDPOINT_PROBE_EXCEPTIONS = ( json.JSONDecodeError, httpx.HTTPError, EnvoyHTTPStatusError, ) pyenphase-pyenphase-1bfa6dd/src/pyenphase/firmware.py000066400000000000000000000106411464551303400232310ustar00rootroot00000000000000"""Envoy Firmware detection""" import logging import time import httpx from awesomeversion import AwesomeVersion from lxml import etree # nosec from tenacity import ( retry, retry_if_exception_type, stop_after_attempt, stop_after_delay, wait_random_exponential, ) from .const import LOCAL_TIMEOUT, MAX_REQUEST_ATTEMPTS, MAX_REQUEST_DELAY from .exceptions import EnvoyFirmwareCheckError, EnvoyFirmwareFatalCheckError _LOGGER = logging.getLogger(__name__) class EnvoyFirmware: """Class for querying and determining the Envoy firmware version.""" __slots__ = ( "_client", "_host", "_firmware_version", "_serial_number", "_part_number", "_url", ) def __init__( self, _client: httpx.AsyncClient, host: str, ) -> None: """Initialize the Envoy firmware version.""" self._client = _client self._host = host self._firmware_version: str | None = None self._serial_number: str | None = None self._part_number: str | None = None self._url: str = "" @retry( retry=retry_if_exception_type((httpx.NetworkError, httpx.RemoteProtocolError)), wait=wait_random_exponential(multiplier=2, max=5), stop=stop_after_delay(MAX_REQUEST_DELAY) | stop_after_attempt(MAX_REQUEST_ATTEMPTS), reraise=True, ) async def _get_info(self) -> httpx.Response: """Obtain the firmware version for Envoy authentication.""" self._url = f"https://{self._host}/info" _LOGGER.debug("Requesting %s with timeout %s", self._url, LOCAL_TIMEOUT) try: return await self._client.get(self._url, timeout=LOCAL_TIMEOUT) except (httpx.ConnectError, httpx.TimeoutException): # Firmware < 7.0.0 does not support HTTPS so we need to try HTTP # as a fallback, worse sometimes http will redirect to https://localhost # which is not helpful self._url = f"http://{self._host}/info" _LOGGER.debug("Retrying to %s with timeout %s", self._url, LOCAL_TIMEOUT) return await self._client.get(self._url, timeout=LOCAL_TIMEOUT) async def setup(self) -> None: """Obtain the firmware version for Envoy authentication.""" # /info will return XML with the firmware version debugon = _LOGGER.isEnabledFor(logging.DEBUG) if debugon: request_start = time.monotonic() try: result = await self._get_info() except httpx.TimeoutException: raise EnvoyFirmwareFatalCheckError(500, "Timeout connecting to Envoy") except httpx.ConnectError: raise EnvoyFirmwareFatalCheckError(500, "Unable to connect to Envoy") except httpx.HTTPError: raise EnvoyFirmwareCheckError(500, "Unable to query firmware version") if (status_code := result.status_code) == 200: if debugon: request_end = time.monotonic() content_type = result.headers.get("content-type") content = result.content _LOGGER.debug( "Request reply in %s sec from %s status %s: %s %s", round(request_end - request_start, 1), self._url, status_code, content_type, content, ) xml = etree.fromstring(result.content) # nosec if (device_tag := xml.find("device")) is not None: if (software_tag := device_tag.find("software")) is not None: self._firmware_version = AwesomeVersion( software_tag.text[1:] ) # need to strip off the leading 'R' or 'D' if (sn_tag := device_tag.find("sn")) is not None: self._serial_number = sn_tag.text if (pn_tag := device_tag.find("pn")) is not None: self._part_number = pn_tag.text return else: # If we get a different status code, raise an exception raise EnvoyFirmwareCheckError(result.status_code, result.text) @property def version(self) -> AwesomeVersion: return self._firmware_version @property def serial(self) -> str | None: return self._serial_number @property def part_number(self) -> str | None: return self._part_number pyenphase-pyenphase-1bfa6dd/src/pyenphase/json.py000066400000000000000000000006361464551303400223710ustar00rootroot00000000000000"""JSON utilities for pyenphase.""" import logging from typing import Any import orjson _LOGGER = logging.getLogger(__name__) def json_loads(end_point: str, json_source: bytes | str) -> Any: try: return orjson.loads(json_source) except orjson.JSONDecodeError as e: _LOGGER.debug( "Unable to decode response from Envoy endpoint %s: %s", end_point, e ) raise pyenphase-pyenphase-1bfa6dd/src/pyenphase/models/000077500000000000000000000000001464551303400223245ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/src/pyenphase/models/__init__.py000066400000000000000000000000001464551303400244230ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/src/pyenphase/models/common.py000066400000000000000000000045041464551303400241710ustar00rootroot00000000000000"""Model for common properties of an envoy.""" from dataclasses import dataclass, field from ..models.meters import CtType, EnvoyPhaseMode @dataclass(slots=True) class CommonProperties: """Model for common properties of an envoy shared amongst all updaters. One set are properties set during probe to share amongst updaters and with clients. These should be reset at each probe run. More properties can be added, originators should handle reset as needed by adding to reset_probe_properties to reset at probe or in a different way or leave existing all lifetime. """ # probe properties here, also add to reset_probe_properties # shared amongst production updaters, needs reset before probe production_fallback_list: list[str] = field( default_factory=list[str] ) #: Fallback production endpoints for Metered without CT # other properties from here, reset by originator # controlled by meters updater phase_count: int = 0 #: number of phases configured in envoy ct_meter_count: int = 0 #: number of active ct meters phase_mode: EnvoyPhaseMode | None = None #: phase mode configured in the CT meters consumption_meter_type: CtType | None = ( None #: What type of consumption meter is installed, if installed ) production_meter_type: CtType | None = ( None #: What type of production meter is installed, if installed ) storage_meter_type: CtType | None = ( None #: What type of storage meter is installed, if installed ) # controlled by production updater active_phase_count: int = 0 #: number of phases actually reporting phase data # controlled by # none_probe_property: str = "hello world" #: test def reset_probe_properties(self) -> None: """Reset common properties that are initialized during probe. probe properties are reset at each probe to avoid sticking memories. This should exclude common properties set outside of probe or controlled by a specific updater, these should be reset at different moments by different method by updaters or owner reset properties: production_fallback_list shared amongst production updaters """ # shared amongst production updaters self.production_fallback_list = [] # shared by pyenphase-pyenphase-1bfa6dd/src/pyenphase/models/dry_contacts.py000066400000000000000000000075021464551303400253760ustar00rootroot00000000000000"""Model for the Enpower dry contact relays.""" # Data Source: URL_DRY_CONTACT_SETTINGS (primary) & URL_DRY_CONTACT_STATUS from __future__ import annotations from dataclasses import dataclass from enum import StrEnum from typing import Any class DryContactStatus(StrEnum): OPEN = "open" CLOSED = "closed" class DryContactAction(StrEnum): APPLY = "apply" SHED = "shed" SCHEDULE = "schedule" NONE = "none" class DryContactType(StrEnum): NONE = "NONE" PV = "PV" LOAD = "LOAD" class DryContactMode(StrEnum): MANUAL = "manual" STATE_OF_CHARGE = "soc" @dataclass(slots=True) class EnvoyDryContactStatus: """Model for the Enpower dry contact relay status.""" id: str status: str @classmethod def from_api(cls, relay: dict[str, Any]) -> EnvoyDryContactStatus: """Initialize from the API.""" return cls( id=relay["id"], status=DryContactStatus(relay["status"]), ) @dataclass(slots=True) class EnvoyDryContactSettings: """Model for the Enpower dry contact relay settings.""" id: str black_start: float | None essential_end_time: float | None essential_start_time: float | None generator_action: DryContactAction grid_action: DryContactAction load_name: str manual_override: bool | None micro_grid_action: DryContactAction mode: DryContactMode override: bool priority: float | None pv_serial_nb: list[Any] soc_high: float soc_low: float type: DryContactType @classmethod def from_api(cls, relay: dict[str, Any]) -> EnvoyDryContactSettings: """Initialize from the API.""" return cls( id=relay["id"], black_start=relay.get("black_s_start"), essential_end_time=relay.get("essential_end_time"), essential_start_time=relay.get("essential_start_time"), generator_action=DryContactAction(relay["gen_action"]), grid_action=DryContactAction(relay["grid_action"]), load_name=relay["load_name"], manual_override=( relay["manual_override"] == "true" if relay.get("manual_override") else None ), micro_grid_action=DryContactAction(relay["micro_grid_action"]), mode=DryContactMode(relay["mode"]), override=relay["override"] == "true", priority=relay.get("priority"), pv_serial_nb=relay["pv_serial_nb"], soc_high=relay["soc_high"], soc_low=relay["soc_low"], type=DryContactType(relay["type"]), ) def to_api(self) -> dict[str, Any]: """Convert to API format.""" retval = { "id": self.id, "gen_action": self.generator_action, "grid_action": self.grid_action, "load_name": self.load_name, # boolean values must be passed to the API as a lowercase string "manual_override": str(self.manual_override).lower(), "micro_grid_action": self.micro_grid_action, "mode": self.mode, "override": str(self.override).lower(), "pv_serial_nb": self.pv_serial_nb, "soc_high": self.soc_high, "soc_low": self.soc_low, "type": self.type, } if self.black_start is not None: retval["black_s_start"] = self.black_start if self.essential_start_time is not None: retval["essential_start_time"] = self.essential_start_time if self.essential_end_time is not None: retval["essential_end_time"] = self.essential_end_time if self.priority is not None: retval["priority"] = self.priority if self.manual_override is not None: retval["manual_override"] = self.manual_override return retval pyenphase-pyenphase-1bfa6dd/src/pyenphase/models/encharge.py000066400000000000000000000070511464551303400244550ustar00rootroot00000000000000"""Model for the Encharge/IQ Battery.""" # Data Source: URL_ENSEMBLE_INVENTORY (primary) & URL_ENCHARGE_BATTERY from __future__ import annotations from dataclasses import dataclass from typing import Any @dataclass(slots=True) class EnvoyEnchargeAggregate: """Model for Encharge aggregate data.""" available_energy: int backup_reserve: int state_of_charge: int reserve_state_of_charge: int configured_reserve_state_of_charge: int max_available_capacity: int @classmethod def from_api(cls, data: dict[str, Any]) -> EnvoyEnchargeAggregate: """Initialize from the API.""" return cls( available_energy=data["ENC_agg_avail_energy"], backup_reserve=data["ENC_agg_backup_energy"], state_of_charge=data["ENC_agg_soc"], reserve_state_of_charge=data["adjusted_backup_soc"], configured_reserve_state_of_charge=data["configured_backup_soc"], max_available_capacity=data["Enc_max_available_capacity"], ) @dataclass(slots=True) class EnvoyEnchargePower: """Model for the Encharge/IQ battery power.""" apparent_power_mva: int real_power_mw: int soc: int @classmethod def from_api(cls, power: dict[str, Any]) -> EnvoyEnchargePower: """Initialize from the API.""" return cls( apparent_power_mva=power["apparent_power_mva"], real_power_mw=power["real_power_mw"], soc=power["soc"], ) @dataclass(slots=True) class EnvoyEncharge: """Model for the Encharge/IQ battery.""" admin_state: int admin_state_str: str bmu_firmware_version: str comm_level_2_4_ghz: int comm_level_sub_ghz: int communicating: bool dc_switch_off: bool encharge_capacity: int encharge_revision: int firmware_loaded_date: int firmware_version: str installed_date: int last_report_date: int led_status: int max_cell_temp: int operating: bool | None part_number: str percent_full: int serial_number: str temperature: int temperature_unit: str zigbee_dongle_fw_version: str | None @classmethod def from_api(cls, inventory: dict[str, Any]) -> EnvoyEncharge: """Initialize from the API.""" return cls( admin_state=inventory["admin_state"], admin_state_str=inventory["admin_state_str"], bmu_firmware_version=inventory["bmu_fw_version"], comm_level_2_4_ghz=inventory["comm_level_2_4_ghz"], comm_level_sub_ghz=inventory["comm_level_sub_ghz"], communicating=inventory["communicating"], dc_switch_off=inventory["dc_switch_off"], encharge_capacity=inventory["encharge_capacity"], encharge_revision=inventory["encharge_rev"], firmware_loaded_date=inventory["img_load_date"], firmware_version=inventory["img_pnum_running"], installed_date=inventory["installed"], last_report_date=inventory["last_rpt_date"], led_status=inventory["led_status"], max_cell_temp=inventory["maxCellTemp"], operating=inventory.get("operating"), # Firmware 8+ does not have this key part_number=inventory["part_num"], percent_full=inventory["percentFull"], serial_number=inventory["serial_num"], temperature=inventory["temperature"], temperature_unit="C", zigbee_dongle_fw_version=inventory.get( "zigbee_dongle_fw_version" ), # Firmware 8+ does not have this key ) pyenphase-pyenphase-1bfa6dd/src/pyenphase/models/enpower.py000066400000000000000000000037201464551303400243570ustar00rootroot00000000000000"""Model for the Enpower/IQ System Controller.""" # Data Source: URL_ENSEMBLE_INVENTORY from __future__ import annotations from dataclasses import dataclass from typing import Any @dataclass(slots=True) class EnvoyEnpower: """Model for the Enpower/IQ System Controller.""" grid_mode: str admin_state: int admin_state_str: str comm_level_2_4_ghz: int comm_level_sub_ghz: int communicating: bool firmware_loaded_date: int firmware_version: str installed_date: int last_report_date: int mains_admin_state: str mains_oper_state: str operating: bool | None part_number: str serial_number: str temperature: int temperature_unit: str zigbee_dongle_fw_version: str | None @classmethod def from_api( cls, enpower: dict[str, Any], ) -> EnvoyEnpower: """Initialize from the API.""" return cls( grid_mode=enpower["Enpwr_grid_mode"], admin_state=enpower["admin_state"], admin_state_str=enpower["admin_state_str"], comm_level_2_4_ghz=enpower["comm_level_2_4_ghz"], comm_level_sub_ghz=enpower["comm_level_sub_ghz"], communicating=enpower["communicating"], firmware_loaded_date=enpower["img_load_date"], firmware_version=enpower["img_pnum_running"], installed_date=enpower["installed"], last_report_date=enpower["last_rpt_date"], mains_admin_state=enpower["mains_admin_state"], mains_oper_state=enpower["mains_oper_state"], operating=enpower.get("operating"), # Firmware 8+ does not have this field part_number=enpower["part_num"], serial_number=enpower["serial_num"], temperature=enpower["temperature"], temperature_unit="F", zigbee_dongle_fw_version=enpower.get( "zigbee_dongle_fw_version" ), # Firmware 8+ does not have this field ) pyenphase-pyenphase-1bfa6dd/src/pyenphase/models/envoy.py000066400000000000000000000046061464551303400240440ustar00rootroot00000000000000"""Model for an envoy.""" from dataclasses import dataclass, field from typing import Any from .dry_contacts import EnvoyDryContactSettings, EnvoyDryContactStatus from .encharge import EnvoyEncharge, EnvoyEnchargeAggregate, EnvoyEnchargePower from .enpower import EnvoyEnpower from .inverter import EnvoyInverter from .meters import EnvoyMeterData from .system_consumption import EnvoySystemConsumption from .system_production import EnvoySystemProduction from .tariff import EnvoyTariff @dataclass(slots=True) class EnvoyData: """Model for an envoy.""" encharge_inventory: dict[str, EnvoyEncharge] | None = None encharge_power: dict[str, EnvoyEnchargePower] | None = None encharge_aggregate: EnvoyEnchargeAggregate | None = None enpower: EnvoyEnpower | None = None system_consumption: EnvoySystemConsumption | None = None system_production: EnvoySystemProduction | None = None system_consumption_phases: dict[str, EnvoySystemConsumption | None] | None = ( None #: Individual phase consumption data, only for Envoy metered with CT installed ) system_production_phases: dict[str, EnvoySystemProduction | None] | None = ( None #: Individual phase production data, only for Envoy metered with CT installed ) ctmeter_production: EnvoyMeterData | None = None #: Production CT Meter data ctmeter_consumption: EnvoyMeterData | None = None #: Consumption CT Meter data ctmeter_storage: EnvoyMeterData | None = None #: Storage CT Meter data ctmeter_production_phases: dict[str, EnvoyMeterData] | None = ( None #: Production CT Meter Individual phase data ) ctmeter_consumption_phases: dict[str, EnvoyMeterData] | None = ( None #: Consumption CT Meter Individual phase data ) ctmeter_storage_phases: dict[str, EnvoyMeterData] | None = ( None #: Storage CT Meter Individual phase data ) dry_contact_status: dict[str, EnvoyDryContactStatus] = field(default_factory=dict) dry_contact_settings: dict[str, EnvoyDryContactSettings] = field( default_factory=dict ) inverters: dict[str, EnvoyInverter] = field(default_factory=dict) tariff: EnvoyTariff | None = None # Raw data is exposed so we can __eq__ the data to see if # anything has changed and consumers of the library can # avoid dispatching data if nothing has changed. raw: dict[str, Any] = field(default_factory=dict) pyenphase-pyenphase-1bfa6dd/src/pyenphase/models/inverter.py000066400000000000000000000012671464551303400245420ustar00rootroot00000000000000"""Model for an Enphase microinverter.""" from __future__ import annotations from dataclasses import dataclass from typing import Any @dataclass(slots=True) class EnvoyInverter: """Model for an Enphase microinverter.""" serial_number: str last_report_date: int last_report_watts: int max_report_watts: int @classmethod def from_v1_api(cls, data: dict[str, Any]) -> EnvoyInverter: """Initialize from the V1 API.""" return cls( serial_number=data["serialNumber"], last_report_date=data["lastReportDate"], last_report_watts=data["lastReportWatts"], max_report_watts=data["maxReportWatts"], ) pyenphase-pyenphase-1bfa6dd/src/pyenphase/models/meters.py000066400000000000000000000064341464551303400242040ustar00rootroot00000000000000"""Model for the Envoy's CT Meters.""" from __future__ import annotations from dataclasses import dataclass from enum import StrEnum from typing import Any, TypedDict class EnvoyPhaseMode(StrEnum): SPLIT = "split" THREE = "three" SINGLE = "single" class CtType(StrEnum): PRODUCTION = "production" NET_CONSUMPTION = "net-consumption" TOTAL_CONSUMPTION = "total-consumption" STORAGE = "storage" class CtState(StrEnum): ENABLED = "enabled" DISABLED = "disabled" class CtMeterStatus(StrEnum): NORMAL = "normal" NOT_METERING = "not-metering" CHECK_WIRING = "check-wiring" class CtStatusFlags(StrEnum): PODUCTION_IMBALANCE = "production-imbalance" NEGATIVE_PRODUCTION = "negative-production" POWER_ON_UNUSED_PHASE = "power-on-unused-phase" NEGATIVE_TOTAL_CONSUMPTION = "negative-total-consumption" class CtMeterData(TypedDict): eid: str state: CtState measurementType: CtType phaseMode: EnvoyPhaseMode phaseCount: int meteringStatus: CtMeterStatus statusFlags: list[CtStatusFlags] @dataclass(slots=True) class EnvoyMeterData: """Model for the Envoy's CT meter data.""" eid: str #: CT meter identifier timestamp: int #: Time of measurement energy_delivered: int #: Lifetime Energy delivered through CT energy_received: int #: Lifetime Energy received through CT active_power: int #: Current power exchang through CT, positive is delivering, negative is receiving power_factor: float #: Power factor reported for CT measurement voltage: float #: Voltage on circuit, when multiphase sum of voltage of individual phases current: float #: current measured by CT frequency: float #: frequency measured by CT state: CtState | None #: Actual State of CT measurement_type: CtType | None #: Measurement type configured for CT metering_status: CtMeterStatus | None #: CT Measurement status status_flags: list[CtStatusFlags] | None #: CT status flags. @classmethod def from_api( cls, data: dict[str, Any], meter_status: CtMeterData ) -> EnvoyMeterData: """Return CT meter data from /ivp/meters and ivp/meters/reading json.""" return cls( eid=data["eid"], timestamp=data["timestamp"], energy_delivered=int(round(data["actEnergyDlvd"])), energy_received=int(round(data["actEnergyRcvd"])), active_power=int(round(data["activePower"])), power_factor=data["pwrFactor"], voltage=data["voltage"], current=data["current"], frequency=data["freq"], state=meter_status["state"], measurement_type=meter_status["measurementType"], metering_status=meter_status["meteringStatus"], status_flags=meter_status["statusFlags"], ) @classmethod def from_phase( cls, data: dict[str, Any], meter_status: CtMeterData, phase: int ) -> EnvoyMeterData | None: """Return CT meter phase data from /ivp/meters and ivp/meters/reading json.""" if "channels" not in data: return None # phase data is in channels list channels = data["channels"] if len(channels) <= phase: return None return cls.from_api(channels[phase], meter_status) pyenphase-pyenphase-1bfa6dd/src/pyenphase/models/storage_settings.py000066400000000000000000000000001464551303400262500ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/src/pyenphase/models/system_consumption.py000066400000000000000000000045171464551303400266670ustar00rootroot00000000000000"""Model for the Envoy's consumption data.""" # Data Source: URL_PRODUCTION from __future__ import annotations from dataclasses import dataclass from typing import Any @dataclass(slots=True) class EnvoySystemConsumption: """Model for the Envoy's (total, house) consumption data.""" watt_hours_lifetime: int #: Lifetime Energy consumed (total-consumption, house) watt_hours_last_7_days: ( int #: Energy consumed in previous 7 days (not including today) ) watt_hours_today: ( int #: Energy consumption since start of day (total-consumption, house) ) watts_now: int #: Current Power consumption (total-consumption, house) @classmethod def from_production(cls, data: dict[str, Any]) -> EnvoySystemConsumption: """Initialize from the production API. :param data: JSON reply from /production endpoint :return: Lifetime, last 7 days, todays energy and current power for total-consumption """ consumption = data["consumption"][0] return cls( watt_hours_lifetime=int(round(consumption["whLifetime"])), watt_hours_last_7_days=int(round(consumption["whLastSevenDays"])), watt_hours_today=int(round(consumption["whToday"])), watts_now=int(round(consumption["wNow"])), ) @classmethod def from_production_phase( cls, data: dict[str, Any], phase: int ) -> EnvoySystemConsumption | None: """Initialize from the production API phase data. :param data: JSON reply from /production endpoint :param phase: Index (0-2) in [lines] segment for which to return data :return: Lifetime, last 7 days, todays energy and current power for total-consumption phase """ # get first consumtpion section which is the total-consumption one. consumption = data["consumption"][0] phases = consumption.get("lines") # Only return data if phase is present. if not phases or phase >= len(phases): return None phase_data = phases[phase] return cls( watt_hours_lifetime=int(round(phase_data["whLifetime"])), watt_hours_last_7_days=int(round(phase_data["whLastSevenDays"])), watt_hours_today=int(round(phase_data["whToday"])), watts_now=int(round(phase_data["wNow"])), ) pyenphase-pyenphase-1bfa6dd/src/pyenphase/models/system_production.py000066400000000000000000000071451464551303400264770ustar00rootroot00000000000000"""Model for the Envoy's production data.""" # Data Source: URL_PRODUCTION from __future__ import annotations from dataclasses import dataclass from typing import Any def find_dict_by_key(all_production: list[dict[str, Any]], key: str) -> dict[str, Any]: """Find a dict by key.""" for production in all_production: if production.get("type") == key: return production raise ValueError(f"{key} is missing") @dataclass(slots=True) class EnvoySystemProduction: """Model for the Envoy's production data.""" watt_hours_lifetime: int #: Lifetime Energy produced watt_hours_last_7_days: ( int #: Energy produced in previous 7 days (not including today) ) watt_hours_today: int #: Energy produced since start of day watts_now: int #: Current Power production @classmethod def from_v1_api(cls, data: dict[str, Any]) -> EnvoySystemProduction: """Initialize from the V1 API. :param data: JSON reply from api/v1/production endpoint :return: Lifetime, last seven days, todays energy and current power for solar production """ return cls( watt_hours_lifetime=data["wattHoursLifetime"], watt_hours_last_7_days=data["wattHoursSevenDays"], watt_hours_today=data["wattHoursToday"], watts_now=data["wattsNow"], ) @classmethod def from_production(cls, data: dict[str, Any]) -> EnvoySystemProduction: """Initialize from the production API. :param data: JSON reply from /production endpoint :return: Lifetime, last seven days, todays energy and current power for solar production """ all_production = data["production"] eim = find_dict_by_key(all_production, "eim") inverters = find_dict_by_key(all_production, "inverters") # This is backwards compatible with envoy_reader # envoy metered without configured CT has whLifetime and wNow in inverters # whLastSevenDays and whToday are incorrect for both so either can be used now_source = eim if eim["activeCount"] else inverters return cls( watt_hours_lifetime=int(round(now_source["whLifetime"])), watt_hours_last_7_days=int( round( eim.get("whLastSevenDays") or inverters.get("whLastSevenDays") or 0 ) ), watt_hours_today=int( round(eim.get("whToday") or inverters.get("whToday") or 0) ), watts_now=int(round(now_source["wNow"])), ) @classmethod def from_production_phase( cls, data: dict[str, Any], phase: int ) -> EnvoySystemProduction | None: """Initialize from the production API phase data. :param data: JSON reply from /production endpoint :param phase: Index (0-2) in [lines] segment for which to return data :return: Lifetime, last seven days, todays energy and current power for production phase """ all_production = data["production"] eim = find_dict_by_key(all_production, "eim") # if {production[type=eim]{Lines[]} or phase is missing return None phases = eim.get("lines") if not phases or phase >= len(phases): return None phase_data = phases[phase] return cls( watt_hours_lifetime=int(round(phase_data.get("whLifetime") or 0)), watt_hours_last_7_days=int(round(phase_data.get("whLastSevenDays") or 0)), watt_hours_today=int(round(phase_data.get("whToday") or 0)), watts_now=int(round(phase_data.get("wNow") or 0)), ) pyenphase-pyenphase-1bfa6dd/src/pyenphase/models/tariff.py000066400000000000000000000064261464551303400241610ustar00rootroot00000000000000"""Model for the Envoy tariff data.""" from __future__ import annotations from dataclasses import dataclass from enum import StrEnum from typing import Any class EnvoyStorageMode(StrEnum): BACKUP = "backup" SELF_CONSUMPTION = "self-consumption" SAVINGS = "economy" LEGACY_SAVINGS = "savings-mode" @dataclass class EnvoyTariff: """Model for the Envoy tariff data.""" currency: dict[str, Any] logger: str | None date: str | None storage_settings: EnvoyStorageSettings | None single_rate: dict[str, Any] seasons: list[Any] seasons_sell: list[Any] | None @classmethod def from_api(cls, data: dict[str, Any]) -> EnvoyTariff: """Initialize from the API.""" return cls( currency=data["currency"], logger=data.get("logger"), date=data.get("date"), storage_settings=( EnvoyStorageSettings.from_api(data["storage_settings"]) if data.get("storage_settings") else None ), single_rate=data["single_rate"], seasons=data["seasons"], seasons_sell=data.get("seasons_sell"), ) def to_api(self) -> dict[str, Any]: """Convert to API format.""" retval = { "currency": self.currency, "single_rate": self.single_rate, "seasons": self.seasons, } if self.logger: retval["logger"] = self.logger if self.date: retval["date"] = self.date if self.seasons_sell: retval["seasons_sell"] = self.seasons_sell if self.storage_settings: retval["storage_settings"] = self.storage_settings.to_api() return retval @dataclass class EnvoyStorageSettings: """Model for the Envoy storage settings.""" mode: EnvoyStorageMode operation_mode_sub_type: str reserved_soc: float very_low_soc: int charge_from_grid: bool date: str | None @classmethod def from_api(cls, data: dict[str, Any]) -> EnvoyStorageSettings: """Initialize from the API.""" return cls( # It appears a `mode` value of `economy` and `savings-mode` is interchangeable # However, the Enlighten app is using the `economy` value, so we will convert # `savings-mode` to `economy` mode=( EnvoyStorageMode.SAVINGS if data["mode"] == EnvoyStorageMode.LEGACY_SAVINGS.value else EnvoyStorageMode(data["mode"]) ), operation_mode_sub_type=data["operation_mode_sub_type"], reserved_soc=data["reserved_soc"], very_low_soc=data["very_low_soc"], charge_from_grid=data["charge_from_grid"], # Some firmware versions don't return date date=data.get("date"), ) def to_api(self) -> dict[str, Any]: """Convert to API format.""" retval = { "mode": self.mode.value, "operation_mode_sub_type": self.operation_mode_sub_type, "reserved_soc": self.reserved_soc, "very_low_soc": self.very_low_soc, "charge_from_grid": self.charge_from_grid, } if self.date is not None: retval["date"] = self.date return retval pyenphase-pyenphase-1bfa6dd/src/pyenphase/py.typed000066400000000000000000000000001464551303400225260ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/src/pyenphase/ssl.py000066400000000000000000000021071464551303400222140ustar00rootroot00000000000000import contextlib import ssl def create_no_verify_ssl_context() -> ssl.SSLContext: """Return an SSL context that does not verify the server certificate. This is a copy of aiohttp's create_default_context() function, with the ssl verify turned off and old SSL versions enabled. https://github.com/aio-libs/aiohttp/blob/33953f110e97eecc707e1402daa8d543f38a189b/aiohttp/connector.py#L911 """ sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) sslcontext.check_hostname = False sslcontext.verify_mode = ssl.CERT_NONE # Allow all ciphers rather than only Python 3.10 default sslcontext.set_ciphers("DEFAULT") with contextlib.suppress(AttributeError): # This only works for OpenSSL >= 1.0.0 sslcontext.options |= ssl.OP_NO_COMPRESSION sslcontext.set_default_verify_paths() return sslcontext NO_VERIFY_SSL_CONTEXT = create_no_verify_ssl_context() def create_default_ssl_context() -> ssl.SSLContext: """Return an default SSL context.""" return ssl.create_default_context() SSL_CONTEXT = create_default_ssl_context() pyenphase-pyenphase-1bfa6dd/src/pyenphase/updaters/000077500000000000000000000000001464551303400226705ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/src/pyenphase/updaters/__init__.py000066400000000000000000000000001464551303400247670ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/src/pyenphase/updaters/api_v1_production.py000066400000000000000000000041611464551303400266710ustar00rootroot00000000000000import logging from typing import Any from ..const import URL_PRODUCTION_V1, SupportedFeatures from ..exceptions import ENDPOINT_PROBE_EXCEPTIONS from ..models.envoy import EnvoyData from ..models.system_production import EnvoySystemProduction from .base import EnvoyUpdater _LOGGER = logging.getLogger(__name__) class EnvoyApiV1ProductionUpdater(EnvoyUpdater): """Class to handle updates for production data.""" async def probe( self, discovered_features: SupportedFeatures ) -> SupportedFeatures | None: """Probe the Envoy for this updater and return SupportedFeatures.""" if SupportedFeatures.PRODUCTION in discovered_features: # Already discovered from another updater return None try: response: dict[str, Any] = await self._json_probe_request(URL_PRODUCTION_V1) except ENDPOINT_PROBE_EXCEPTIONS as e: _LOGGER.debug( "Production endpoint not found at %s: %s", URL_PRODUCTION_V1, e ) return None # Envoy metered without configured CT returns zero's in V1 Production Endpoint # sometimes wNow has a value. When Watthours Today, last 7 days and lifetime # are all 3 zero is an indication envoy is not reporting summed values in V1 production # return None to fallback to inverters section in production endpoint. if all( value == 0 for key, value in response.items() if key.startswith("wattHours") ): _LOGGER.debug( "Detected broken production endpoint bug at %s: %s", URL_PRODUCTION_V1, response, ) return None self._supported_features |= SupportedFeatures.PRODUCTION return self._supported_features async def update(self, envoy_data: EnvoyData) -> None: """Update the Envoy for this updater.""" production_data = await self._json_request(URL_PRODUCTION_V1) envoy_data.raw[URL_PRODUCTION_V1] = production_data envoy_data.system_production = EnvoySystemProduction.from_v1_api( production_data ) pyenphase-pyenphase-1bfa6dd/src/pyenphase/updaters/api_v1_production_inverters.py000066400000000000000000000033611464551303400307730ustar00rootroot00000000000000import logging from typing import Any from ..const import URL_PRODUCTION_INVERTERS, SupportedFeatures from ..exceptions import ENDPOINT_PROBE_EXCEPTIONS, EnvoyAuthenticationRequired from ..models.envoy import EnvoyData from ..models.inverter import EnvoyInverter from .base import EnvoyUpdater _LOGGER = logging.getLogger(__name__) class EnvoyApiV1ProductionInvertersUpdater(EnvoyUpdater): """Class to handle updates for inverter production data.""" async def probe( self, discovered_features: SupportedFeatures ) -> SupportedFeatures | None: """Probe the Envoy for this updater and return SupportedFeatures.""" try: await self._json_probe_request(URL_PRODUCTION_INVERTERS) except ENDPOINT_PROBE_EXCEPTIONS as e: _LOGGER.debug( "Production endpoint not found at %s: %s", URL_PRODUCTION_INVERTERS, e ) return None except EnvoyAuthenticationRequired as e: _LOGGER.debug( "Disabling inverters production endpoint as user does" " not have access to %s: %s", URL_PRODUCTION_INVERTERS, e, ) return None self._supported_features |= SupportedFeatures.INVERTERS return self._supported_features async def update(self, envoy_data: EnvoyData) -> None: """Update the Envoy for this updater.""" inverters_data: list[dict[str, Any]] = await self._json_request( URL_PRODUCTION_INVERTERS ) envoy_data.raw[URL_PRODUCTION_INVERTERS] = inverters_data envoy_data.inverters = { inverter["serialNumber"]: EnvoyInverter.from_v1_api(inverter) for inverter in inverters_data } pyenphase-pyenphase-1bfa6dd/src/pyenphase/updaters/base.py000066400000000000000000000037571464551303400241700ustar00rootroot00000000000000from abc import abstractmethod from collections.abc import Awaitable from typing import Any, Callable import httpx from awesomeversion import AwesomeVersion from ..const import SupportedFeatures from ..exceptions import EnvoyHTTPStatusError from ..json import json_loads from ..models.common import CommonProperties from ..models.envoy import EnvoyData class EnvoyUpdater: """Base class for Envoy updaters.""" def __init__( self, envoy_version: AwesomeVersion, probe_request: Callable[[str], Awaitable[httpx.Response]], request: Callable[[str], Awaitable[httpx.Response]], common_properties: CommonProperties, ) -> None: """Initialize the Envoy endpoint.""" self._envoy_version = envoy_version self._probe_request = probe_request self._request = request self._supported_features = SupportedFeatures(0) self._common_properties = common_properties async def _json_request(self, end_point: str) -> Any: """Make a request to the Envoy and return the JSON response.""" response = await self._request(end_point) if not (200 <= response.status_code < 300): raise EnvoyHTTPStatusError(response.status_code, response.url) return json_loads(end_point, response.content) async def _json_probe_request(self, end_point: str) -> Any: """Make a probe request to the Envoy and return the JSON response.""" response = await self._probe_request(end_point) if not (200 <= response.status_code < 300): raise EnvoyHTTPStatusError(response.status_code, response.url) return json_loads(end_point, response.content) @abstractmethod async def probe( self, discovered_features: SupportedFeatures ) -> SupportedFeatures | None: """Probe the Envoy for this updater and return SupportedFeatures.""" @abstractmethod async def update(self, envoy_data: EnvoyData) -> None: """Update the Envoy for this updater.""" pyenphase-pyenphase-1bfa6dd/src/pyenphase/updaters/ensemble.py000066400000000000000000000114651464551303400250430ustar00rootroot00000000000000import logging from typing import Any from ..const import ( ENSEMBLE_MIN_VERSION, URL_DRY_CONTACT_SETTINGS, URL_DRY_CONTACT_STATUS, URL_ENCHARGE_BATTERY, URL_ENSEMBLE_INVENTORY, URL_ENSEMBLE_SECCTRL, SupportedFeatures, ) from ..exceptions import ENDPOINT_PROBE_EXCEPTIONS from ..models.dry_contacts import EnvoyDryContactSettings, EnvoyDryContactStatus from ..models.encharge import EnvoyEncharge, EnvoyEnchargeAggregate, EnvoyEnchargePower from ..models.enpower import EnvoyEnpower from ..models.envoy import EnvoyData from .base import EnvoyUpdater _LOGGER = logging.getLogger(__name__) class EnvoyEnembleUpdater(EnvoyUpdater): """Class to handle updates for Ensemble devices.""" async def probe( self, discovered_features: SupportedFeatures ) -> SupportedFeatures | None: """Probe the Envoy for this updater and return SupportedFeatures.""" if self._envoy_version < ENSEMBLE_MIN_VERSION: _LOGGER.debug("Firmware too old for Ensemble support") return None # Check for various Ensemble support # The Ensemble Inventory endpoint will tell us if we have Enpower or Encharge support try: result = await self._json_probe_request(URL_ENSEMBLE_INVENTORY) except ENDPOINT_PROBE_EXCEPTIONS as e: _LOGGER.debug("Ensemble Inventory endpoint not found: %s", e) else: if not result or "error" in result: # Newer firmware with no Ensemble devices returns an empty list _LOGGER.debug("No Ensemble devices found") return None for item in result: if item["type"] == "ENPOWER": self._supported_features |= SupportedFeatures.ENPOWER if item["type"] == "ENCHARGE": self._supported_features |= SupportedFeatures.ENCHARGE return self._supported_features async def update(self, envoy_data: EnvoyData) -> None: """Update the Envoy for this updater.""" # Update Enpower and Encharge data if supported supported_features = self._supported_features ensemble_inventory_data: list[dict[str, Any]] = await self._json_request( URL_ENSEMBLE_INVENTORY ) envoy_data.raw[URL_ENSEMBLE_INVENTORY] = ensemble_inventory_data ensemble_secctrl_data: dict[str, Any] = await self._json_request( URL_ENSEMBLE_SECCTRL ) envoy_data.raw[URL_ENSEMBLE_SECCTRL] = await self._json_request( URL_ENSEMBLE_SECCTRL ) if supported_features & SupportedFeatures.ENCHARGE: encharge_power_data: dict[str, Any] = await self._json_request( URL_ENCHARGE_BATTERY ) envoy_data.raw[URL_ENCHARGE_BATTERY] = encharge_power_data power: dict[str, Any] = { device["serial_num"]: device for device in encharge_power_data["devices:"] } inventory: dict[str, Any] = {} for item in ensemble_inventory_data: if item["type"] != "ENCHARGE": continue inventory = {device["serial_num"]: device for device in item["devices"]} envoy_data.encharge_inventory = { serial: EnvoyEncharge.from_api(inventory[serial]) for serial in inventory } envoy_data.encharge_power = { serial: EnvoyEnchargePower.from_api(power[serial]) for serial in power } envoy_data.encharge_aggregate = EnvoyEnchargeAggregate.from_api( ensemble_secctrl_data ) if supported_features & SupportedFeatures.ENPOWER: # Update Enpower data for item in ensemble_inventory_data: if item["type"] != "ENPOWER": continue enpower_data = item["devices"][0] envoy_data.enpower = EnvoyEnpower.from_api(enpower_data) # Update dry contact data dry_contact_status_data: dict[str, Any] = await self._json_request( URL_DRY_CONTACT_STATUS ) envoy_data.raw[URL_DRY_CONTACT_STATUS] = dry_contact_status_data dry_contact_settings_data: dict[str, Any] = await self._json_request( URL_DRY_CONTACT_SETTINGS ) envoy_data.raw[URL_DRY_CONTACT_SETTINGS] = dry_contact_settings_data envoy_data.dry_contact_status = { relay["id"]: EnvoyDryContactStatus.from_api(relay) for relay in dry_contact_status_data["dry_contacts"] } envoy_data.dry_contact_settings = { relay["id"]: EnvoyDryContactSettings.from_api(relay) for relay in dry_contact_settings_data["dry_contacts"] } pyenphase-pyenphase-1bfa6dd/src/pyenphase/updaters/generator.py000066400000000000000000000033501464551303400252310ustar00rootroot00000000000000import logging from typing import Any from ..const import ENSEMBLE_MIN_VERSION, URL_GEN_CONFIG, SupportedFeatures from ..exceptions import ENDPOINT_PROBE_EXCEPTIONS from ..models.envoy import EnvoyData from .base import EnvoyUpdater _LOGGER = logging.getLogger(__name__) class EnvoyGeneratorUpdater(EnvoyUpdater): """Class to handle updates for Generator information.""" async def probe( self, discovered_features: SupportedFeatures ) -> SupportedFeatures | None: """Probe the Envoy for this updater and return SupportedFeatures.""" if self._envoy_version < ENSEMBLE_MIN_VERSION: _LOGGER.debug("Firmware too old for Ensemble support") return None # If there's no Enpower smart switch, we can skip the generator probe if SupportedFeatures.ENPOWER not in discovered_features: return None # Check for generator support try: result = await self._json_probe_request(URL_GEN_CONFIG) except ENDPOINT_PROBE_EXCEPTIONS as e: _LOGGER.debug("Generator config endpoint not found: %s", e) else: if not result or "error" in result or "err" in result: # Newer firmware with no generator configured returns an empty dict _LOGGER.debug("No generator found") return None self._supported_features |= SupportedFeatures.GENERATOR return self._supported_features async def update(self, envoy_data: EnvoyData) -> None: """Update the generator data if supported.""" generator_config_data: list[dict[str, Any]] = await self._json_request( URL_GEN_CONFIG ) envoy_data.raw[URL_GEN_CONFIG] = generator_config_data pyenphase-pyenphase-1bfa6dd/src/pyenphase/updaters/meters.py000066400000000000000000000237771464551303400245610ustar00rootroot00000000000000"""Envoy CT Meter updater""" import logging from typing import Any from ..const import ( ENDPOINT_URL_METERS, ENDPOINT_URL_METERS_READINGS, PHASENAMES, SupportedFeatures, ) from ..exceptions import ENDPOINT_PROBE_EXCEPTIONS, EnvoyAuthenticationRequired from ..models.envoy import EnvoyData from ..models.meters import CtMeterData, CtState, CtType, EnvoyMeterData, EnvoyPhaseMode from .base import EnvoyUpdater _LOGGER = logging.getLogger(__name__) class EnvoyMetersUpdater(EnvoyUpdater): """Class to handle updates for Envoy CT Meters.""" end_point = ENDPOINT_URL_METERS #: endpoint in envoy to read CT meter configuration data_end_point = ( ENDPOINT_URL_METERS_READINGS #: endpoint in Envoy to read CT meter data ) production_meter_type: CtType | None = None #: Production CT type consumption_meter_type: CtType | None = None #: Consumpion CT type (net or total) storage_meter_type: CtType | None = None #: Storage CT type phase_mode: EnvoyPhaseMode | None = ( None #: Phase mode configured (Single, Dual or Three) ) phase_count: int = 0 #: Number of phases configured and measured in the Envoy ct_meters_count: int = ( 0 #: Number of installed current transformers (Envoy metered Only) ) production_meter_eid: str | None = None #: Production CT identifier consumption_meter_eid: str | None = None #: Consumption CT identifier storage_meter_eid: str | None = None #: Storage CT identifier def _set_common_properties(self) -> None: """Set Envoy common properties we own and control""" self._common_properties.phase_count = self.phase_count self._common_properties.phase_mode = self.phase_mode self._common_properties.consumption_meter_type = self.consumption_meter_type self._common_properties.production_meter_type = self.production_meter_type self._common_properties.storage_meter_type = self.storage_meter_type self._common_properties.ct_meter_count = self.ct_meters_count async def probe( self, discovered_features: SupportedFeatures ) -> SupportedFeatures | None: """Probe the Envoy meter setup and return CT and multiphase details in SupportedFeatures. Get CT configuration info from ivp/meters in the Envoy and determine any multi-phase setup. Set Threephase or Dualphase supported feature if Envoy is in one of these setups. Set common property information in envoy data for phase_count, ct_meter_count, phase_mode and ct_consumption_meter type to default or found values. These 4 are owned by this updater. :param discovered_features: Features discovered by other updaters for this updater to skip :return: features discovered by this updater """ if SupportedFeatures.CTMETERS in discovered_features: # Already discovered from another updater return None # set defaults for common properties we own and will set self.phase_count = 1 # Default to 1 phase which is overall numbers only self.ct_meters_count = ( 0 # default no CT, are pnly available on Envoy metered if configured ) self.phase_mode = ( None # Phase mode only if ct meters are installed and configured ) self.production_meter_type = None # Type of production CT If installed self.consumption_meter_type = None # Type of consumption ct if installed. self.storage_meter_type = None # Type of storage CT If installed # set the defaults in global common properties in case we exit early self._set_common_properties() # set local defaults not shared in common properties self.production_meter_eid = None self.consumption_meter_eid = None self.storage_meter_eid = None try: meters_json: list[CtMeterData] | None = await self._json_probe_request( self.end_point ) except ENDPOINT_PROBE_EXCEPTIONS as e: _LOGGER.debug("Meters endpoint not found at %s: %s", self.end_point, e) return None except EnvoyAuthenticationRequired as e: # For D3.18.10 (f0855e) systems return 401 even if the user has access # to the endpoint so we must skip it. _LOGGER.debug( "Skipping meters endpoint as user does not have access to %s: %s", self.end_point, e, ) return None else: # The endpoint can return valid json on error # in the form of {"error": "message"} if not meters_json or "error" in meters_json: # Non metered Envoy return empty list _LOGGER.debug("No CT Meters found") return None # Set multiphase features so other providers/models can return phase data self.phase_count = 1 for meter in meters_json: if meter["state"] == CtState.ENABLED: # remember what mode meter is installed if meter["measurementType"] == CtType.PRODUCTION: self.production_meter_type = meter["measurementType"] # save meter identifier for link between /ivp/meters and /ivp/meters/readings self.production_meter_eid = meter["eid"] if meter["measurementType"] in ( CtType.NET_CONSUMPTION, CtType.TOTAL_CONSUMPTION, ): self.consumption_meter_type = meter["measurementType"] # save meter identifier for link between /ivp/meters and /ivp/meters/readings self.consumption_meter_eid = meter["eid"] if meter["measurementType"] == CtType.STORAGE: self.storage_meter_type = meter["measurementType"] self.storage_meter_eid = meter["eid"] self.ct_meters_count += 1 self.phase_mode = meter["phaseMode"] self.phase_count = ( meter["phaseCount"] if meter["phaseCount"] > self.phase_count else self.phase_count ) # report phase configuration in envoy common property self._set_common_properties() # report DUAL or THREE PHASE feature for use by next updaters probe if self.phase_count > 2: self._supported_features |= SupportedFeatures.THREEPHASE elif self.phase_count > 1: self._supported_features |= SupportedFeatures.DUALPHASE # Signal CTMETERS feature back so update will get used if we found ctmeters if self.ct_meters_count > 0: self._supported_features |= SupportedFeatures.CTMETERS return self._supported_features async def update(self, envoy_data: EnvoyData) -> None: """Update the Envoy data from the meters endpoints. Get CT configuration from ivp/meters and CT readings from ivp/meters/readings. Store data as EnvoyMeterData in ctmeter_production, ctmeter_consumption if either meter is found enabled during probe. If more then 1 phase is active, store phase data in ctmeter_production_phases and ctmeter_consumption_phases. Match data in ivp/meters and ivp/meters/reading using the eid field in both datasets. :param envoy_data: EnvoyData structure to store data to """ # get the meter status and readings from the envoy meters_status: list[CtMeterData] = await self._json_request(self.end_point) meters_readings: list[dict[str, Any]] = await self._json_request( self.data_end_point ) envoy_data.raw[self.end_point] = meters_status envoy_data.raw[self.data_end_point] = meters_readings phase_range = self.phase_count if self.phase_count > 1 else 0 for index, meter in enumerate(meters_readings): eid = meter["eid"] ct_data = meters_status[index] # match meter identifier to one found during probe to identify production or consumption if eid == self.production_meter_eid and self.production_meter_type: # if production meter was enabled (type known) store ctmeter production data envoy_data.ctmeter_production = EnvoyMeterData.from_api(meter, ct_data) # if more then 1 phase configured store ctmeter phase data if phase_data := _meter_data_for_phases(phase_range, meter, ct_data): envoy_data.ctmeter_production_phases = phase_data # match meter identifier to one found during probe to identify production or consumption elif eid == self.consumption_meter_eid and self.consumption_meter_type: # if consumption meter was enabled (type known) store ctmeter consumption data envoy_data.ctmeter_consumption = EnvoyMeterData.from_api(meter, ct_data) # if more then 1 phase configured store ctmeter phase data if phase_data := _meter_data_for_phases(phase_range, meter, ct_data): envoy_data.ctmeter_consumption_phases = phase_data # match meter identifier to storage meter found during probe elif eid == self.storage_meter_eid and self.storage_meter_type: # if storage meter was enabled (type known) store ctmeter storage data envoy_data.ctmeter_storage = EnvoyMeterData.from_api(meter, ct_data) if phase_data := _meter_data_for_phases(phase_range, meter, ct_data): envoy_data.ctmeter_storage_phases = phase_data def _meter_data_for_phases( phase_range: int, meter: dict[str, Any], ct_data: CtMeterData ) -> dict[str, EnvoyMeterData]: """Build a dictionary of phase data for multi-phase setups.""" meter_data_by_phase: dict[str, EnvoyMeterData] = { PHASENAMES[phase_idx]: data for phase_idx in range(phase_range) if (data := EnvoyMeterData.from_phase(meter, ct_data, phase_idx)) } return meter_data_by_phase pyenphase-pyenphase-1bfa6dd/src/pyenphase/updaters/production.py000066400000000000000000000174721464551303400254430ustar00rootroot00000000000000"""Envoy production data updater""" import logging from typing import Any from ..const import PHASENAMES, URL_PRODUCTION, URL_PRODUCTION_JSON, SupportedFeatures from ..exceptions import ENDPOINT_PROBE_EXCEPTIONS, EnvoyAuthenticationRequired from ..models.envoy import EnvoyData from ..models.system_consumption import EnvoySystemConsumption from ..models.system_production import EnvoySystemProduction from .base import EnvoyUpdater _LOGGER = logging.getLogger(__name__) class EnvoyProductionUpdater(EnvoyUpdater): """Class to handle updates for production data.""" end_point = URL_PRODUCTION allow_inverters_fallback = False async def probe( self, discovered_features: SupportedFeatures ) -> SupportedFeatures | None: """Probe the Envoy for this endpoint and return SupportedFeatures.""" discovered_total_consumption = ( SupportedFeatures.TOTAL_CONSUMPTION in discovered_features ) discovered_net_consumption = ( SupportedFeatures.NET_CONSUMPTION in discovered_features ) discovered_production = SupportedFeatures.PRODUCTION in discovered_features # obtain any registered production endpoints that replied back from the common list # when in allow_inverters_fallback mode we can use the first one that worked working_endpoints: list[str] = self._common_properties.production_fallback_list if ( discovered_total_consumption and discovered_net_consumption and discovered_production ): # Already discovered from another updater return None # when active allow_inverters_fallback use first successful endpoint registered in the list if self.allow_inverters_fallback and working_endpoints: self.end_point = working_endpoints[0] try: production_json: dict[str, Any] = await self._json_probe_request( self.end_point ) except ENDPOINT_PROBE_EXCEPTIONS as e: _LOGGER.debug("Production endpoint not found at %s: %s", self.end_point, e) return None except EnvoyAuthenticationRequired as e: # For URL_PRODUCTION some systems return 401 even if the user has access # to the endpoint, but for URL_PRODUCTION_JSON is the only way to check # if the user has access to the endpoint if self.end_point == URL_PRODUCTION: _LOGGER.debug( "Skipping production endpoint as user does" " not have access to %s: %s", self.end_point, e, ) return None raise active_phase_count = 0 phase_count = self._common_properties.phase_count # if endpoint is not in the list of successful endpoints yet, add it. if ( self.end_point not in working_endpoints and not self.allow_inverters_fallback ): working_endpoints.append(self.end_point) if not discovered_production: production: list[dict[str, Any]] | None = production_json.get("production") if production: for type_ in production: if type_["type"] == "eim" and type_["activeCount"]: self._supported_features |= SupportedFeatures.METERING self._supported_features |= SupportedFeatures.PRODUCTION if lines := type_.get("lines"): active_phase_count = len(lines) break if ( self.allow_inverters_fallback and type_["type"] == "inverters" and type_["activeCount"] ): self._supported_features |= SupportedFeatures.PRODUCTION break consumption: list[dict[str, Any]] | None = production_json.get("consumption") if consumption: for meter in consumption: meter_type = meter["measurementType"] if not meter.get("activeCount"): continue if ( not discovered_total_consumption and meter_type == "total-consumption" ): self._supported_features |= SupportedFeatures.TOTAL_CONSUMPTION if not discovered_net_consumption and meter_type == "net-consumption": self._supported_features |= SupportedFeatures.NET_CONSUMPTION if lines := meter.get("lines"): active_phase_count = len(lines) # register the updated fallback endpoints to the common list self._common_properties.production_fallback_list = working_endpoints self._common_properties.active_phase_count = active_phase_count if active_phase_count != phase_count and phase_count > 1: _LOGGER.debug( "Expected Production report Phase values not available, %s of %s", active_phase_count, phase_count, ) return self._supported_features async def update(self, envoy_data: EnvoyData) -> None: """Update the Envoy for this endpoint.""" production_data = await self._json_request(self.end_point) envoy_data.raw[self.end_point] = production_data # get phase count from Envoy common features phase_count = self._common_properties.phase_count if self._supported_features & SupportedFeatures.PRODUCTION: envoy_data.system_production = EnvoySystemProduction.from_production( production_data ) # get production phase data if more then 1 phase is found phase_production: dict[str, EnvoySystemProduction | None] = {} for phase in range(phase_count if phase_count > 1 else 0): production: EnvoySystemProduction | None = ( EnvoySystemProduction.from_production_phase(production_data, phase) ) # exclude None phases that are expected but not actually in production report if production: phase_production[PHASENAMES[phase]] = production if len(phase_production) > 0: envoy_data.system_production_phases = phase_production if ( self._supported_features & SupportedFeatures.NET_CONSUMPTION or self._supported_features & SupportedFeatures.TOTAL_CONSUMPTION ): envoy_data.system_consumption = EnvoySystemConsumption.from_production( production_data ) # get consumption phase data if more then 1 phase is found phase_consumption: dict[str, EnvoySystemConsumption | None] = {} for phase in range(phase_count if phase_count > 1 else 0): consumption: EnvoySystemConsumption | None = ( EnvoySystemConsumption.from_production_phase(production_data, phase) ) # exclude None phases that are expected but not actually in production report if consumption: phase_consumption[PHASENAMES[phase]] = consumption if len(phase_consumption) > 0: envoy_data.system_consumption_phases = phase_consumption class EnvoyProductionJsonUpdater(EnvoyProductionUpdater): """Class to handle updates for production data from the production.json endpoint.""" end_point = URL_PRODUCTION_JSON class EnvoyProductionJsonFallbackUpdater(EnvoyProductionJsonUpdater): """Class to handle updates for production data from the production.json endpoint. This class will accept the production endpoint even if activeCount is 0 """ allow_inverters_fallback = True pyenphase-pyenphase-1bfa6dd/src/pyenphase/updaters/tariff.py000066400000000000000000000030251464551303400245150ustar00rootroot00000000000000import logging from ..const import URL_TARIFF, SupportedFeatures from ..exceptions import ENDPOINT_PROBE_EXCEPTIONS, EnvoyAuthenticationRequired from ..models.envoy import EnvoyData from ..models.tariff import EnvoyTariff from .base import EnvoyUpdater _LOGGER = logging.getLogger(__name__) class EnvoyTariffUpdater(EnvoyUpdater): """Class to handle updates for the Envoy tariff data.""" async def probe( self, discovered_features: SupportedFeatures ) -> SupportedFeatures | None: try: result = await self._json_probe_request(URL_TARIFF) except ENDPOINT_PROBE_EXCEPTIONS as e: _LOGGER.debug("Tariff endpoint not found: %s", e) return None except EnvoyAuthenticationRequired as e: # For some systems (Firmware: 3.9.36) return 401 for # this endpoint even if the user is authenticated. _LOGGER.debug( "Skipping tariff endpoint as user does" " not have access to %s: %s", URL_TARIFF, e, ) return None else: if not result or "error" in result: _LOGGER.debug("No tariff data found") return None self._supported_features |= SupportedFeatures.TARIFF return self._supported_features async def update(self, envoy_data: EnvoyData) -> None: raw = await self._json_request(URL_TARIFF) envoy_data.raw[URL_TARIFF] = raw envoy_data.tariff = EnvoyTariff.from_api(raw["tariff"]) pyenphase-pyenphase-1bfa6dd/tests/000077500000000000000000000000001464551303400174205ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/__init__.py000066400000000000000000000000001464551303400215170ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/__snapshots__/000077500000000000000000000000001464551303400222365ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/__snapshots__/test_endpoints.ambr000066400000000000000000016225571464551303400261650ustar00rootroot00000000000000# serializer version: 1 # name: test_with_7_x_firmware[4.10.35] dict({ 'ctmeter_consumption': dict({ 'active_power': 567, 'current': 8.389, 'eid': 704643584, 'energy_delivered': 16908209, 'energy_received': 17357690, 'frequency': 60.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': 0.5, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1695301419, 'voltage': 247.736, }), 'ctmeter_consumption_phases': dict({ : dict({ 'active_power': 394, 'current': 5.208, 'eid': 1778385425, 'energy_delivered': 10220652, 'energy_received': 8001772, 'frequency': 60.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': 0.549, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1695301419, 'voltage': 123.867, }), : dict({ 'active_power': 173, 'current': 3.181, 'eid': 1778385426, 'energy_delivered': 6687557, 'energy_received': 9355918, 'frequency': 60.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': 0.426, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1695301419, 'voltage': 123.869, }), }), 'ctmeter_production': dict({ 'active_power': 166, 'current': 3.692, 'eid': 704643328, 'energy_delivered': 26785327, 'energy_received': 0, 'frequency': 60.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.394, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1695301419, 'voltage': 247.659, }), 'ctmeter_production_phases': dict({ : dict({ 'active_power': 83, 'current': 1.844, 'eid': 1778385169, 'energy_delivered': 13398798, 'energy_received': 0, 'frequency': 60.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.4, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1695301419, 'voltage': 123.824, }), : dict({ 'active_power': 84, 'current': 1.848, 'eid': 1778385170, 'energy_delivered': 13386530, 'energy_received': 0, 'frequency': 60.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.387, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1695301419, 'voltage': 123.836, }), }), 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ }), 'dry_contact_status': dict({ }), 'encharge_aggregate': None, 'encharge_inventory': None, 'encharge_power': None, 'enpower': None, 'inverters': dict({ '122002010484': dict({ 'last_report_date': 1695301305, 'last_report_watts': 13, 'max_report_watts': 300, 'serial_number': '122002010484', }), '122002010488': dict({ 'last_report_date': 1695301325, 'last_report_watts': 13, 'max_report_watts': 305, 'serial_number': '122002010488', }), '122002010489': dict({ 'last_report_date': 1695301317, 'last_report_watts': 13, 'max_report_watts': 306, 'serial_number': '122002010489', }), '122002010577': dict({ 'last_report_date': 1695301322, 'last_report_watts': 13, 'max_report_watts': 305, 'serial_number': '122002010577', }), '122002011248': dict({ 'last_report_date': 1695301330, 'last_report_watts': 13, 'max_report_watts': 227, 'serial_number': '122002011248', }), '122002017614': dict({ 'last_report_date': 1695301321, 'last_report_watts': 13, 'max_report_watts': 294, 'serial_number': '122002017614', }), '122002017669': dict({ 'last_report_date': 1695301327, 'last_report_watts': 12, 'max_report_watts': 305, 'serial_number': '122002017669', }), '122002021078': dict({ 'last_report_date': 1695301323, 'last_report_watts': 12, 'max_report_watts': 306, 'serial_number': '122002021078', }), '122002021258': dict({ 'last_report_date': 1695301327, 'last_report_watts': 13, 'max_report_watts': 305, 'serial_number': '122002021258', }), '122002021381': dict({ 'last_report_date': 1695301308, 'last_report_watts': 13, 'max_report_watts': 305, 'serial_number': '122002021381', }), '122002026181': dict({ 'last_report_date': 1695301309, 'last_report_watts': 13, 'max_report_watts': 287, 'serial_number': '122002026181', }), '122002026190': dict({ 'last_report_date': 1695301313, 'last_report_watts': 13, 'max_report_watts': 289, 'serial_number': '122002026190', }), '122002027876': dict({ 'last_report_date': 1695301332, 'last_report_watts': 13, 'max_report_watts': 306, 'serial_number': '122002027876', }), '122002040286': dict({ 'last_report_date': 1695301314, 'last_report_watts': 13, 'max_report_watts': 299, 'serial_number': '122002040286', }), '122002041618': dict({ 'last_report_date': 1695301318, 'last_report_watts': 13, 'max_report_watts': 292, 'serial_number': '122002041618', }), '122002041621': dict({ 'last_report_date': 1695301310, 'last_report_watts': 13, 'max_report_watts': 197, 'serial_number': '122002041621', }), '122002041626': dict({ 'last_report_date': 1695301330, 'last_report_watts': 13, 'max_report_watts': 306, 'serial_number': '122002041626', }), '122002041636': dict({ 'last_report_date': 1695301319, 'last_report_watts': 13, 'max_report_watts': 300, 'serial_number': '122002041636', }), '122002041638': dict({ 'last_report_date': 1695301314, 'last_report_watts': 13, 'max_report_watts': 296, 'serial_number': '122002041638', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'date': '2023-05-11 19:46:56 UTC', 'source': 'Tariff', 'version': '00.00.01', }), 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'seasons': list([ dict({ 'days': list([ ]), 'id': 'season_1', 'start': '1/1', 'tiers': list([ dict({ 'id': 'tier_1', 'limit': 500, 'rate': 0.21835, }), dict({ 'id': 'tier_2', 'limit': 1200, 'rate': 0.19587, }), dict({ 'id': 'tier_3', 'limit': -1, 'rate': 0.15798, }), ]), }), ]), 'single_rate': dict({ 'rate': 0.21835, }), }), }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1695301309, 'lastReportWatts': 13, 'maxReportWatts': 287, 'serialNumber': '122002026181', }), dict({ 'devType': 1, 'lastReportDate': 1695301314, 'lastReportWatts': 13, 'maxReportWatts': 299, 'serialNumber': '122002040286', }), dict({ 'devType': 1, 'lastReportDate': 1695301305, 'lastReportWatts': 13, 'maxReportWatts': 300, 'serialNumber': '122002010484', }), dict({ 'devType': 1, 'lastReportDate': 1695301313, 'lastReportWatts': 13, 'maxReportWatts': 289, 'serialNumber': '122002026190', }), dict({ 'devType': 1, 'lastReportDate': 1695301318, 'lastReportWatts': 13, 'maxReportWatts': 292, 'serialNumber': '122002041618', }), dict({ 'devType': 1, 'lastReportDate': 1695301327, 'lastReportWatts': 13, 'maxReportWatts': 305, 'serialNumber': '122002021258', }), dict({ 'devType': 1, 'lastReportDate': 1695301325, 'lastReportWatts': 13, 'maxReportWatts': 305, 'serialNumber': '122002010488', }), dict({ 'devType': 1, 'lastReportDate': 1695301330, 'lastReportWatts': 13, 'maxReportWatts': 306, 'serialNumber': '122002041626', }), dict({ 'devType': 1, 'lastReportDate': 1695301327, 'lastReportWatts': 12, 'maxReportWatts': 305, 'serialNumber': '122002017669', }), dict({ 'devType': 1, 'lastReportDate': 1695301321, 'lastReportWatts': 13, 'maxReportWatts': 294, 'serialNumber': '122002017614', }), dict({ 'devType': 1, 'lastReportDate': 1695301332, 'lastReportWatts': 13, 'maxReportWatts': 306, 'serialNumber': '122002027876', }), dict({ 'devType': 1, 'lastReportDate': 1695301330, 'lastReportWatts': 13, 'maxReportWatts': 227, 'serialNumber': '122002011248', }), dict({ 'devType': 1, 'lastReportDate': 1695301323, 'lastReportWatts': 12, 'maxReportWatts': 306, 'serialNumber': '122002021078', }), dict({ 'devType': 1, 'lastReportDate': 1695301308, 'lastReportWatts': 13, 'maxReportWatts': 305, 'serialNumber': '122002021381', }), dict({ 'devType': 1, 'lastReportDate': 1695301314, 'lastReportWatts': 13, 'maxReportWatts': 296, 'serialNumber': '122002041638', }), dict({ 'devType': 1, 'lastReportDate': 1695301319, 'lastReportWatts': 13, 'maxReportWatts': 300, 'serialNumber': '122002041636', }), dict({ 'devType': 1, 'lastReportDate': 1695301310, 'lastReportWatts': 13, 'maxReportWatts': 197, 'serialNumber': '122002041621', }), dict({ 'devType': 1, 'lastReportDate': 1695301317, 'lastReportWatts': 13, 'maxReportWatts': 306, 'serialNumber': '122002010489', }), dict({ 'devType': 1, 'lastReportDate': 1695301322, 'lastReportWatts': 13, 'maxReportWatts': 305, 'serialNumber': '122002010577', }), ]), '/ivp/meters': list([ dict({ 'eid': 704643328, 'measurementType': 'production', 'meteringStatus': 'normal', 'phaseCount': 2, 'phaseMode': 'split', 'state': 'enabled', 'statusFlags': list([ ]), }), dict({ 'eid': 704643584, 'measurementType': 'net-consumption', 'meteringStatus': 'normal', 'phaseCount': 2, 'phaseMode': 'split', 'state': 'enabled', 'statusFlags': list([ ]), }), ]), '/ivp/meters/readings': list([ dict({ 'actEnergyDlvd': 26785327.449, 'actEnergyRcvd': 0.001, 'activePower': 166.489, 'apparentEnergy': 33655488.016, 'apparentPower': 457.211, 'channels': list([ dict({ 'actEnergyDlvd': 13398797.544, 'actEnergyRcvd': 0.001, 'activePower': 82.913, 'apparentEnergy': 16836537.224, 'apparentPower': 228.406, 'current': 1.844, 'eid': 1778385169, 'freq': 60.0, 'instantaneousDemand': 82.913, 'pwrFactor': 0.4, 'reactEnergyLagg': 5169167.875, 'reactEnergyLead': 0.0, 'reactivePower': 191.751, 'timestamp': 1695301419, 'voltage': 123.824, }), dict({ 'actEnergyDlvd': 13386529.904, 'actEnergyRcvd': 0.0, 'activePower': 83.576, 'apparentEnergy': 16818950.792, 'apparentPower': 228.804, 'current': 1.848, 'eid': 1778385170, 'freq': 60.0, 'instantaneousDemand': 83.576, 'pwrFactor': 0.387, 'reactEnergyLagg': 5122825.568, 'reactEnergyLead': 0.001, 'reactivePower': 191.574, 'timestamp': 1695301419, 'voltage': 123.836, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 0.0, 'activePower': 0.0, 'apparentEnergy': 0.0, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385171, 'freq': 60.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 0.0, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1695301419, 'voltage': 0.0, }), ]), 'current': 3.692, 'eid': 704643328, 'freq': 60.0, 'instantaneousDemand': 166.489, 'pwrFactor': 0.394, 'reactEnergyLagg': 10291993.443, 'reactEnergyLead': 0.001, 'reactivePower': 383.325, 'timestamp': 1695301419, 'voltage': 247.659, }), dict({ 'actEnergyDlvd': 16908208.78, 'actEnergyRcvd': 17357690.272, 'activePower': 566.864, 'apparentEnergy': 41943778.605, 'apparentPower': 1063.035, 'channels': list([ dict({ 'actEnergyDlvd': 10220652.219, 'actEnergyRcvd': 8001771.78, 'activePower': 393.965, 'apparentEnergy': 22610499.739, 'apparentPower': 668.739, 'current': 5.208, 'eid': 1778385425, 'freq': 60.0, 'instantaneousDemand': 393.965, 'pwrFactor': 0.549, 'reactEnergyLagg': 87750.153, 'reactEnergyLead': 7841689.25, 'reactivePower': -337.072, 'timestamp': 1695301419, 'voltage': 123.867, }), dict({ 'actEnergyDlvd': 6687556.561, 'actEnergyRcvd': 9355918.492, 'activePower': 172.899, 'apparentEnergy': 19333278.866, 'apparentPower': 394.296, 'current': 3.181, 'eid': 1778385426, 'freq': 60.0, 'instantaneousDemand': 172.899, 'pwrFactor': 0.426, 'reactEnergyLagg': 455469.296, 'reactEnergyLead': 5687697.556, 'reactivePower': -243.946, 'timestamp': 1695301419, 'voltage': 123.869, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 0.0, 'activePower': 0.0, 'apparentEnergy': 0.0, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385427, 'freq': 60.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 0.0, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1695301419, 'voltage': 0.0, }), ]), 'current': 8.389, 'eid': 704643584, 'freq': 60.0, 'instantaneousDemand': 566.864, 'pwrFactor': 0.5, 'reactEnergyLagg': 543219.449, 'reactEnergyLead': 13529386.807, 'reactivePower': -581.018, 'timestamp': 1695301419, 'voltage': 247.736, }), ]), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 1, 'apprntPwr': 3189.788, 'measurementType': 'total-consumption', 'pwrFactor': 0.25, 'reactPwr': -959.115, 'readingTime': 1695301418, 'rmsCurrent': 12.88, 'rmsVoltage': 247.663, 'type': 'eim', 'vahLifetime': 41943777.997, 'vahToday': 9709.997, 'varhLagLifetime': 10835212.67, 'varhLagToday': 3120.67, 'varhLeadLifetime': 13529386.465, 'varhLeadToday': 4281.465, 'wNow': 806.405, 'whLastSevenDays': 163075.411, 'whLifetime': 26335790.411, 'whToday': 7412.411, }), dict({ 'activeCount': 1, 'apprntPwr': 1155.626, 'measurementType': 'net-consumption', 'pwrFactor': 0.53, 'reactPwr': -577.46, 'readingTime': 1695301418, 'rmsCurrent': 9.195, 'rmsVoltage': 247.696, 'type': 'eim', 'vahLifetime': 41943777.997, 'vahToday': 0, 'varhLagLifetime': 543219.449, 'varhLagToday': 0, 'varhLeadLifetime': 13529386.464, 'varhLeadToday': 0, 'wNow': 640.874, 'whLastSevenDays': 0, 'whLifetime': 16908208.46, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 19, 'readingTime': 1695301333, 'type': 'inverters', 'wNow': 246, 'whLifetime': 26890410, }), dict({ 'activeCount': 1, 'apprntPwr': 457.492, 'measurementType': 'production', 'pwrFactor': 0.35, 'reactPwr': 381.654, 'readingTime': 1695301418, 'rmsCurrent': 3.685, 'rmsVoltage': 247.631, 'type': 'eim', 'vahLifetime': 33655487.75, 'vahToday': 3288.75, 'varhLagLifetime': 10291993.22, 'varhLagToday': 3108.22, 'varhLeadLifetime': 0.001, 'varhLeadToday': 0.001, 'wNow': 165.53, 'whLastSevenDays': 179155.351, 'whLifetime': 26785327.351, 'whToday': 139.351, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': dict({ 'watt_hours_last_7_days': 163075, 'watt_hours_lifetime': 26335790, 'watt_hours_today': 7412, 'watts_now': 806, }), 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 179155, 'watt_hours_lifetime': 26785327, 'watt_hours_today': 139, 'watts_now': 166, }), 'system_production_phases': None, 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': None, 'logger': None, 'seasons': list([ dict({ 'days': list([ ]), 'id': 'season_1', 'start': '1/1', 'tiers': list([ dict({ 'id': 'tier_1', 'limit': 500, 'rate': 0.21835, }), dict({ 'id': 'tier_2', 'limit': 1200, 'rate': 0.19587, }), dict({ 'id': 'tier_3', 'limit': -1, 'rate': 0.15798, }), ]), }), ]), 'seasons_sell': None, 'single_rate': dict({ 'rate': 0.21835, }), 'storage_settings': None, }), }) # --- # name: test_with_7_x_firmware[5.0.62] dict({ 'ctmeter_consumption': None, 'ctmeter_consumption_phases': None, 'ctmeter_production': None, 'ctmeter_production_phases': None, 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ }), 'dry_contact_status': dict({ }), 'encharge_aggregate': None, 'encharge_inventory': None, 'encharge_power': None, 'enpower': None, 'inverters': dict({ '121547055830': dict({ 'last_report_date': 1694554884, 'last_report_watts': 201, 'max_report_watts': 247, 'serial_number': '121547055830', }), '121547059008': dict({ 'last_report_date': 1694554837, 'last_report_watts': 203, 'max_report_watts': 247, 'serial_number': '121547059008', }), '121547059079': dict({ 'last_report_date': 1694554838, 'last_report_watts': 202, 'max_report_watts': 246, 'serial_number': '121547059079', }), '121547059102': dict({ 'last_report_date': 1694554873, 'last_report_watts': 159, 'max_report_watts': 247, 'serial_number': '121547059102', }), '121547059107': dict({ 'last_report_date': 1694554863, 'last_report_watts': 204, 'max_report_watts': 247, 'serial_number': '121547059107', }), '121547059108': dict({ 'last_report_date': 1694554865, 'last_report_watts': 202, 'max_report_watts': 246, 'serial_number': '121547059108', }), '121547059112': dict({ 'last_report_date': 1694554890, 'last_report_watts': 200, 'max_report_watts': 248, 'serial_number': '121547059112', }), '121547059128': dict({ 'last_report_date': 1694554858, 'last_report_watts': 204, 'max_report_watts': 248, 'serial_number': '121547059128', }), '121547059193': dict({ 'last_report_date': 1694554845, 'last_report_watts': 201, 'max_report_watts': 244, 'serial_number': '121547059193', }), '121547059202': dict({ 'last_report_date': 1694554848, 'last_report_watts': 200, 'max_report_watts': 243, 'serial_number': '121547059202', }), '121547059217': dict({ 'last_report_date': 1694554886, 'last_report_watts': 210, 'max_report_watts': 249, 'serial_number': '121547059217', }), '121547059253': dict({ 'last_report_date': 1694554896, 'last_report_watts': 202, 'max_report_watts': 249, 'serial_number': '121547059253', }), '121547059333': dict({ 'last_report_date': 1694554877, 'last_report_watts': 202, 'max_report_watts': 248, 'serial_number': '121547059333', }), '121547059354': dict({ 'last_report_date': 1694554892, 'last_report_watts': 206, 'max_report_watts': 250, 'serial_number': '121547059354', }), '121547059355': dict({ 'last_report_date': 1694554861, 'last_report_watts': 207, 'max_report_watts': 249, 'serial_number': '121547059355', }), '121547059357': dict({ 'last_report_date': 1694554850, 'last_report_watts': 201, 'max_report_watts': 242, 'serial_number': '121547059357', }), '121547059359': dict({ 'last_report_date': 1694554843, 'last_report_watts': 205, 'max_report_watts': 249, 'serial_number': '121547059359', }), '121547059360': dict({ 'last_report_date': 1694554839, 'last_report_watts': 204, 'max_report_watts': 246, 'serial_number': '121547059360', }), '121547059363': dict({ 'last_report_date': 1694554852, 'last_report_watts': 198, 'max_report_watts': 242, 'serial_number': '121547059363', }), '121547059381': dict({ 'last_report_date': 1694554856, 'last_report_watts': 205, 'max_report_watts': 249, 'serial_number': '121547059381', }), '121547059889': dict({ 'last_report_date': 1694554862, 'last_report_watts': 204, 'max_report_watts': 247, 'serial_number': '121547059889', }), '121547060383': dict({ 'last_report_date': 1694554853, 'last_report_watts': 204, 'max_report_watts': 246, 'serial_number': '121547060383', }), '121547060384': dict({ 'last_report_date': 1694554845, 'last_report_watts': 206, 'max_report_watts': 248, 'serial_number': '121547060384', }), '121547060392': dict({ 'last_report_date': 1694554895, 'last_report_watts': 208, 'max_report_watts': 250, 'serial_number': '121547060392', }), '121547060396': dict({ 'last_report_date': 1694554867, 'last_report_watts': 205, 'max_report_watts': 248, 'serial_number': '121547060396', }), '121547060412': dict({ 'last_report_date': 1694554855, 'last_report_watts': 197, 'max_report_watts': 220, 'serial_number': '121547060412', }), '121547060415': dict({ 'last_report_date': 1694554866, 'last_report_watts': 205, 'max_report_watts': 249, 'serial_number': '121547060415', }), '121547060590': dict({ 'last_report_date': 1694554881, 'last_report_watts': 180, 'max_report_watts': 234, 'serial_number': '121547060590', }), '121547060592': dict({ 'last_report_date': 1694554881, 'last_report_watts': 204, 'max_report_watts': 247, 'serial_number': '121547060592', }), '121547060593': dict({ 'last_report_date': 1694554871, 'last_report_watts': 206, 'max_report_watts': 248, 'serial_number': '121547060593', }), '121547060643': dict({ 'last_report_date': 1694554888, 'last_report_watts': 200, 'max_report_watts': 248, 'serial_number': '121547060643', }), '121547060647': dict({ 'last_report_date': 1694554890, 'last_report_watts': 207, 'max_report_watts': 249, 'serial_number': '121547060647', }), '121547060650': dict({ 'last_report_date': 1694554848, 'last_report_watts': 199, 'max_report_watts': 242, 'serial_number': '121547060650', }), '121547060670': dict({ 'last_report_date': 1694554870, 'last_report_watts': 199, 'max_report_watts': 243, 'serial_number': '121547060670', }), '121547060671': dict({ 'last_report_date': 1694554887, 'last_report_watts': 60, 'max_report_watts': 224, 'serial_number': '121547060671', }), '121547060727': dict({ 'last_report_date': 1694554877, 'last_report_watts': 204, 'max_report_watts': 249, 'serial_number': '121547060727', }), '121547060758': dict({ 'last_report_date': 1694554874, 'last_report_watts': 197, 'max_report_watts': 240, 'serial_number': '121547060758', }), '121547060761': dict({ 'last_report_date': 1694554857, 'last_report_watts': 202, 'max_report_watts': 244, 'serial_number': '121547060761', }), '121547060766': dict({ 'last_report_date': 1694554837, 'last_report_watts': 202, 'max_report_watts': 244, 'serial_number': '121547060766', }), '121547060773': dict({ 'last_report_date': 1694554841, 'last_report_watts': 202, 'max_report_watts': 246, 'serial_number': '121547060773', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'date': '2023-08-10 17:59:03 UTC', 'source': 'Tariff', 'version': '00.00.02', }), 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'seasons': list([ ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.0, 'sell': 0.0, }), }), }), '/api/v1/production': dict({ 'wattHoursLifetime': 133798553, 'wattHoursSevenDays': 366671, 'wattHoursToday': 20161, 'wattsNow': 7907, }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1694554838, 'lastReportWatts': 202, 'maxReportWatts': 246, 'serialNumber': '121547059079', }), dict({ 'devType': 1, 'lastReportDate': 1694554845, 'lastReportWatts': 201, 'maxReportWatts': 244, 'serialNumber': '121547059193', }), dict({ 'devType': 1, 'lastReportDate': 1694554839, 'lastReportWatts': 204, 'maxReportWatts': 246, 'serialNumber': '121547059360', }), dict({ 'devType': 1, 'lastReportDate': 1694554845, 'lastReportWatts': 206, 'maxReportWatts': 248, 'serialNumber': '121547060384', }), dict({ 'devType': 1, 'lastReportDate': 1694554852, 'lastReportWatts': 198, 'maxReportWatts': 242, 'serialNumber': '121547059363', }), dict({ 'devType': 1, 'lastReportDate': 1694554848, 'lastReportWatts': 199, 'maxReportWatts': 242, 'serialNumber': '121547060650', }), dict({ 'devType': 1, 'lastReportDate': 1694554858, 'lastReportWatts': 204, 'maxReportWatts': 248, 'serialNumber': '121547059128', }), dict({ 'devType': 1, 'lastReportDate': 1694554865, 'lastReportWatts': 202, 'maxReportWatts': 246, 'serialNumber': '121547059108', }), dict({ 'devType': 1, 'lastReportDate': 1694554871, 'lastReportWatts': 206, 'maxReportWatts': 248, 'serialNumber': '121547060593', }), dict({ 'devType': 1, 'lastReportDate': 1694554873, 'lastReportWatts': 159, 'maxReportWatts': 247, 'serialNumber': '121547059102', }), dict({ 'devType': 1, 'lastReportDate': 1694554881, 'lastReportWatts': 180, 'maxReportWatts': 234, 'serialNumber': '121547060590', }), dict({ 'devType': 1, 'lastReportDate': 1694554887, 'lastReportWatts': 60, 'maxReportWatts': 224, 'serialNumber': '121547060671', }), dict({ 'devType': 1, 'lastReportDate': 1694554892, 'lastReportWatts': 206, 'maxReportWatts': 250, 'serialNumber': '121547059354', }), dict({ 'devType': 1, 'lastReportDate': 1694554896, 'lastReportWatts': 202, 'maxReportWatts': 249, 'serialNumber': '121547059253', }), dict({ 'devType': 1, 'lastReportDate': 1694554895, 'lastReportWatts': 208, 'maxReportWatts': 250, 'serialNumber': '121547060392', }), dict({ 'devType': 1, 'lastReportDate': 1694554890, 'lastReportWatts': 200, 'maxReportWatts': 248, 'serialNumber': '121547059112', }), dict({ 'devType': 1, 'lastReportDate': 1694554890, 'lastReportWatts': 207, 'maxReportWatts': 249, 'serialNumber': '121547060647', }), dict({ 'devType': 1, 'lastReportDate': 1694554888, 'lastReportWatts': 200, 'maxReportWatts': 248, 'serialNumber': '121547060643', }), dict({ 'devType': 1, 'lastReportDate': 1694554886, 'lastReportWatts': 210, 'maxReportWatts': 249, 'serialNumber': '121547059217', }), dict({ 'devType': 1, 'lastReportDate': 1694554884, 'lastReportWatts': 201, 'maxReportWatts': 247, 'serialNumber': '121547055830', }), dict({ 'devType': 1, 'lastReportDate': 1694554881, 'lastReportWatts': 204, 'maxReportWatts': 247, 'serialNumber': '121547060592', }), dict({ 'devType': 1, 'lastReportDate': 1694554874, 'lastReportWatts': 197, 'maxReportWatts': 240, 'serialNumber': '121547060758', }), dict({ 'devType': 1, 'lastReportDate': 1694554877, 'lastReportWatts': 202, 'maxReportWatts': 248, 'serialNumber': '121547059333', }), dict({ 'devType': 1, 'lastReportDate': 1694554877, 'lastReportWatts': 204, 'maxReportWatts': 249, 'serialNumber': '121547060727', }), dict({ 'devType': 1, 'lastReportDate': 1694554837, 'lastReportWatts': 203, 'maxReportWatts': 247, 'serialNumber': '121547059008', }), dict({ 'devType': 1, 'lastReportDate': 1694554841, 'lastReportWatts': 202, 'maxReportWatts': 246, 'serialNumber': '121547060773', }), dict({ 'devType': 1, 'lastReportDate': 1694554848, 'lastReportWatts': 200, 'maxReportWatts': 243, 'serialNumber': '121547059202', }), dict({ 'devType': 1, 'lastReportDate': 1694554857, 'lastReportWatts': 202, 'maxReportWatts': 244, 'serialNumber': '121547060761', }), dict({ 'devType': 1, 'lastReportDate': 1694554855, 'lastReportWatts': 197, 'maxReportWatts': 220, 'serialNumber': '121547060412', }), dict({ 'devType': 1, 'lastReportDate': 1694554861, 'lastReportWatts': 207, 'maxReportWatts': 249, 'serialNumber': '121547059355', }), dict({ 'devType': 1, 'lastReportDate': 1694554866, 'lastReportWatts': 205, 'maxReportWatts': 249, 'serialNumber': '121547060415', }), dict({ 'devType': 1, 'lastReportDate': 1694554870, 'lastReportWatts': 199, 'maxReportWatts': 243, 'serialNumber': '121547060670', }), dict({ 'devType': 1, 'lastReportDate': 1694554867, 'lastReportWatts': 205, 'maxReportWatts': 248, 'serialNumber': '121547060396', }), dict({ 'devType': 1, 'lastReportDate': 1694554863, 'lastReportWatts': 204, 'maxReportWatts': 247, 'serialNumber': '121547059107', }), dict({ 'devType': 1, 'lastReportDate': 1694554862, 'lastReportWatts': 204, 'maxReportWatts': 247, 'serialNumber': '121547059889', }), dict({ 'devType': 1, 'lastReportDate': 1694554853, 'lastReportWatts': 204, 'maxReportWatts': 246, 'serialNumber': '121547060383', }), dict({ 'devType': 1, 'lastReportDate': 1694554837, 'lastReportWatts': 202, 'maxReportWatts': 244, 'serialNumber': '121547060766', }), dict({ 'devType': 1, 'lastReportDate': 1694554843, 'lastReportWatts': 205, 'maxReportWatts': 249, 'serialNumber': '121547059359', }), dict({ 'devType': 1, 'lastReportDate': 1694554850, 'lastReportWatts': 201, 'maxReportWatts': 242, 'serialNumber': '121547059357', }), dict({ 'devType': 1, 'lastReportDate': 1694554856, 'lastReportWatts': 205, 'maxReportWatts': 249, 'serialNumber': '121547059381', }), ]), }), 'system_consumption': None, 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 366671, 'watt_hours_lifetime': 133798553, 'watt_hours_today': 20161, 'watts_now': 7907, }), 'system_production_phases': None, 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': None, 'logger': None, 'seasons': list([ ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.0, 'sell': 0.0, }), 'storage_settings': None, }), }) # --- # name: test_with_7_x_firmware[7.3.130] dict({ 'ctmeter_consumption': None, 'ctmeter_consumption_phases': None, 'ctmeter_production': None, 'ctmeter_production_phases': None, 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ }), 'dry_contact_status': dict({ }), 'encharge_aggregate': None, 'encharge_inventory': None, 'encharge_power': None, 'enpower': None, 'inverters': dict({ '202218023114': dict({ 'last_report_date': 1691342554, 'last_report_watts': 14, 'max_report_watts': 346, 'serial_number': '202218023114', }), '202218024705': dict({ 'last_report_date': 1691342553, 'last_report_watts': 8, 'max_report_watts': 345, 'serial_number': '202218024705', }), '202218025399': dict({ 'last_report_date': 1691342465, 'last_report_watts': 10, 'max_report_watts': 350, 'serial_number': '202218025399', }), '202218026521': dict({ 'last_report_date': 1691342464, 'last_report_watts': 9, 'max_report_watts': 347, 'serial_number': '202218026521', }), '202218028926': dict({ 'last_report_date': 1691342462, 'last_report_watts': 17, 'max_report_watts': 346, 'serial_number': '202218028926', }), '202218029586': dict({ 'last_report_date': 1691342643, 'last_report_watts': 12, 'max_report_watts': 347, 'serial_number': '202218029586', }), '202218031593': dict({ 'last_report_date': 1691342674, 'last_report_watts': 20, 'max_report_watts': 348, 'serial_number': '202218031593', }), '202218034002': dict({ 'last_report_date': 1691342555, 'last_report_watts': 14, 'max_report_watts': 345, 'serial_number': '202218034002', }), '202218035988': dict({ 'last_report_date': 1691342613, 'last_report_watts': 17, 'max_report_watts': 348, 'serial_number': '202218035988', }), '202218036214': dict({ 'last_report_date': 1691342432, 'last_report_watts': 13, 'max_report_watts': 347, 'serial_number': '202218036214', }), '202218036386': dict({ 'last_report_date': 1691342584, 'last_report_watts': 9, 'max_report_watts': 346, 'serial_number': '202218036386', }), '202218037990': dict({ 'last_report_date': 1691342525, 'last_report_watts': 16, 'max_report_watts': 348, 'serial_number': '202218037990', }), }), 'raw': dict({ '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1691342432, 'lastReportWatts': 13, 'maxReportWatts': 347, 'serialNumber': '202218036214', }), dict({ 'devType': 1, 'lastReportDate': 1691342462, 'lastReportWatts': 17, 'maxReportWatts': 346, 'serialNumber': '202218028926', }), dict({ 'devType': 1, 'lastReportDate': 1691342643, 'lastReportWatts': 12, 'maxReportWatts': 347, 'serialNumber': '202218029586', }), dict({ 'devType': 1, 'lastReportDate': 1691342613, 'lastReportWatts': 17, 'maxReportWatts': 348, 'serialNumber': '202218035988', }), dict({ 'devType': 1, 'lastReportDate': 1691342553, 'lastReportWatts': 8, 'maxReportWatts': 345, 'serialNumber': '202218024705', }), dict({ 'devType': 1, 'lastReportDate': 1691342554, 'lastReportWatts': 14, 'maxReportWatts': 346, 'serialNumber': '202218023114', }), dict({ 'devType': 1, 'lastReportDate': 1691342525, 'lastReportWatts': 16, 'maxReportWatts': 348, 'serialNumber': '202218037990', }), dict({ 'devType': 1, 'lastReportDate': 1691342555, 'lastReportWatts': 14, 'maxReportWatts': 345, 'serialNumber': '202218034002', }), dict({ 'devType': 1, 'lastReportDate': 1691342464, 'lastReportWatts': 9, 'maxReportWatts': 347, 'serialNumber': '202218026521', }), dict({ 'devType': 1, 'lastReportDate': 1691342465, 'lastReportWatts': 10, 'maxReportWatts': 350, 'serialNumber': '202218025399', }), dict({ 'devType': 1, 'lastReportDate': 1691342584, 'lastReportWatts': 9, 'maxReportWatts': 346, 'serialNumber': '202218036386', }), dict({ 'devType': 1, 'lastReportDate': 1691342674, 'lastReportWatts': 20, 'maxReportWatts': 348, 'serialNumber': '202218031593', }), ]), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 1, 'apprntPwr': 5108.445, 'measurementType': 'total-consumption', 'pwrFactor': 0.27, 'reactPwr': -1565.844, 'readingTime': 1691342712, 'rmsCurrent': 21.153, 'rmsVoltage': 241.499, 'type': 'eim', 'vahLifetime': 14686267.589, 'vahToday': 22482.589, 'varhLagLifetime': 998203.693, 'varhLagToday': 1456.693, 'varhLeadLifetime': 10691664.429, 'varhLeadToday': 13981.429, 'wNow': 1393.191, 'whLastSevenDays': 365473.825, 'whLifetime': 10154380.825, 'whToday': 15177.825, }), dict({ 'activeCount': 1, 'apprntPwr': 2118.15, 'measurementType': 'net-consumption', 'pwrFactor': 0.59, 'reactPwr': -1596.082, 'readingTime': 1691342712, 'rmsCurrent': 17.572, 'rmsVoltage': 241.437, 'type': 'eim', 'vahLifetime': 14686267.589, 'vahToday': 0, 'varhLagLifetime': 258967.196, 'varhLagToday': 0, 'varhLeadLifetime': 10652517.939, 'varhLeadToday': 0, 'wNow': 1214.696, 'whLastSevenDays': 0, 'whLifetime': 7116675.502, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 12, 'readingTime': 1691342674, 'type': 'inverters', 'wNow': 158, 'whLifetime': 142373, }), dict({ 'activeCount': 1, 'apprntPwr': 432.848, 'measurementType': 'production', 'pwrFactor': 0.41, 'reactPwr': -30.238, 'readingTime': 1691342712, 'rmsCurrent': 3.581, 'rmsVoltage': 241.56, 'type': 'eim', 'vahLifetime': 4846260.619, 'vahToday': 1977.619, 'varhLagLifetime': 739236.497, 'varhLagToday': 1457.497, 'varhLeadLifetime': 39146.49, 'varhLeadToday': 40.49, 'wNow': 178.495, 'whLastSevenDays': 149972.105, 'whLifetime': 3659506.105, 'whToday': 86.105, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': dict({ 'watt_hours_last_7_days': 365474, 'watt_hours_lifetime': 10154381, 'watt_hours_today': 15178, 'watts_now': 1393, }), 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 149972, 'watt_hours_lifetime': 3659506, 'watt_hours_today': 86, 'watts_now': 178, }), 'system_production_phases': None, 'tariff': None, }) # --- # name: test_with_7_x_firmware[7.3.130_no_consumption] dict({ 'ctmeter_consumption': None, 'ctmeter_consumption_phases': None, 'ctmeter_production': dict({ 'active_power': 3625, 'current': 30.223, 'eid': 704643328, 'energy_delivered': 4545930, 'energy_received': 1, 'frequency': 60.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.988, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1694549733, 'voltage': 241.696, }), 'ctmeter_production_phases': dict({ : dict({ 'active_power': 1811, 'current': 15.11, 'eid': 1778385169, 'energy_delivered': 2271794, 'energy_received': 0, 'frequency': 60.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.988, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1694549733, 'voltage': 120.749, }), : dict({ 'active_power': 1814, 'current': 15.113, 'eid': 1778385170, 'energy_delivered': 2274136, 'energy_received': 0, 'frequency': 60.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.988, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1694549733, 'voltage': 120.946, }), }), 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ }), 'dry_contact_status': dict({ }), 'encharge_aggregate': None, 'encharge_inventory': None, 'encharge_power': None, 'enpower': None, 'inverters': dict({ '202302072076': dict({ 'last_report_date': 1694549623, 'last_report_watts': 271, 'max_report_watts': 300, 'serial_number': '202302072076', }), '202302073177': dict({ 'last_report_date': 1694549622, 'last_report_watts': 271, 'max_report_watts': 299, 'serial_number': '202302073177', }), '202302073203': dict({ 'last_report_date': 1694549592, 'last_report_watts': 276, 'max_report_watts': 301, 'serial_number': '202302073203', }), '202302073606': dict({ 'last_report_date': 1694549655, 'last_report_watts': 269, 'max_report_watts': 300, 'serial_number': '202302073606', }), '202302074252': dict({ 'last_report_date': 1694549653, 'last_report_watts': 269, 'max_report_watts': 300, 'serial_number': '202302074252', }), '202302075515': dict({ 'last_report_date': 1694549531, 'last_report_watts': 284, 'max_report_watts': 300, 'serial_number': '202302075515', }), '202302076392': dict({ 'last_report_date': 1694549625, 'last_report_watts': 271, 'max_report_watts': 301, 'serial_number': '202302076392', }), '202302076838': dict({ 'last_report_date': 1694549652, 'last_report_watts': 266, 'max_report_watts': 300, 'serial_number': '202302076838', }), '202302077015': dict({ 'last_report_date': 1694549626, 'last_report_watts': 269, 'max_report_watts': 300, 'serial_number': '202302077015', }), '202302077415': dict({ 'last_report_date': 1694549654, 'last_report_watts': 266, 'max_report_watts': 300, 'serial_number': '202302077415', }), '202302077506': dict({ 'last_report_date': 1694549561, 'last_report_watts': 283, 'max_report_watts': 300, 'serial_number': '202302077506', }), '202302077890': dict({ 'last_report_date': 1694549594, 'last_report_watts': 276, 'max_report_watts': 300, 'serial_number': '202302077890', }), '482236040239': dict({ 'last_report_date': 1694549628, 'last_report_watts': 272, 'max_report_watts': 300, 'serial_number': '482236040239', }), '482236040258': dict({ 'last_report_date': 1694549627, 'last_report_watts': 273, 'max_report_watts': 300, 'serial_number': '482236040258', }), '482236040746': dict({ 'last_report_date': 1694549624, 'last_report_watts': 270, 'max_report_watts': 300, 'serial_number': '482236040746', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'battery_mode': 'self-consumption', 'charge_from_grid': False, 'date': '2023-07-09 22:07:02 UTC', 'operation_mode_sub_type': '', 'override': False, 'override_backup_soc': 30.0, 'override_chg_dischg_rate': 0.0, 'override_tou_mode': 'StorageTouMode_DEFAULT_TOU_MODE', 'reserved_soc': 0.0, 'schedule': dict({ 'Disable': list([ dict({ 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), ]), 'tariff': list([ dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'end': '1/1', 'start': '1/1', }), ]), }), 'source': 'Tariff', 'version': '00.00.02', 'very_low_soc': 5, }), 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': '1680547193', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ ]), 'id': 'season_1', 'start': '1/1', 'tiers': list([ dict({ 'id': 'tier_1', 'limit': 1000, 'rate': 0.15128, }), dict({ 'id': 'tier_2', 'limit': -1, 'rate': 0.1585, }), ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.15128, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1680547193', 'mode': 'self-consumption', 'operation_mode_sub_type': '', 'reserved_soc': 0.0, 'very_low_soc': 5, }), }), }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1694549622, 'lastReportWatts': 271, 'maxReportWatts': 299, 'serialNumber': '202302073177', }), dict({ 'devType': 1, 'lastReportDate': 1694549623, 'lastReportWatts': 271, 'maxReportWatts': 300, 'serialNumber': '202302072076', }), dict({ 'devType': 1, 'lastReportDate': 1694549592, 'lastReportWatts': 276, 'maxReportWatts': 301, 'serialNumber': '202302073203', }), dict({ 'devType': 1, 'lastReportDate': 1694549531, 'lastReportWatts': 284, 'maxReportWatts': 300, 'serialNumber': '202302075515', }), dict({ 'devType': 1, 'lastReportDate': 1694549624, 'lastReportWatts': 270, 'maxReportWatts': 300, 'serialNumber': '482236040746', }), dict({ 'devType': 1, 'lastReportDate': 1694549625, 'lastReportWatts': 271, 'maxReportWatts': 301, 'serialNumber': '202302076392', }), dict({ 'devType': 1, 'lastReportDate': 1694549561, 'lastReportWatts': 283, 'maxReportWatts': 300, 'serialNumber': '202302077506', }), dict({ 'devType': 1, 'lastReportDate': 1694549626, 'lastReportWatts': 269, 'maxReportWatts': 300, 'serialNumber': '202302077015', }), dict({ 'devType': 1, 'lastReportDate': 1694549652, 'lastReportWatts': 266, 'maxReportWatts': 300, 'serialNumber': '202302076838', }), dict({ 'devType': 1, 'lastReportDate': 1694549627, 'lastReportWatts': 273, 'maxReportWatts': 300, 'serialNumber': '482236040258', }), dict({ 'devType': 1, 'lastReportDate': 1694549594, 'lastReportWatts': 276, 'maxReportWatts': 300, 'serialNumber': '202302077890', }), dict({ 'devType': 1, 'lastReportDate': 1694549653, 'lastReportWatts': 269, 'maxReportWatts': 300, 'serialNumber': '202302074252', }), dict({ 'devType': 1, 'lastReportDate': 1694549654, 'lastReportWatts': 266, 'maxReportWatts': 300, 'serialNumber': '202302077415', }), dict({ 'devType': 1, 'lastReportDate': 1694549628, 'lastReportWatts': 272, 'maxReportWatts': 300, 'serialNumber': '482236040239', }), dict({ 'devType': 1, 'lastReportDate': 1694549655, 'lastReportWatts': 269, 'maxReportWatts': 300, 'serialNumber': '202302073606', }), ]), '/ivp/meters': list([ dict({ 'eid': 704643328, 'measurementType': 'production', 'meteringStatus': 'normal', 'phaseCount': 2, 'phaseMode': 'split', 'state': 'enabled', 'statusFlags': list([ ]), }), dict({ 'eid': 704643584, 'measurementType': 'net-consumption', 'meteringStatus': 'normal', 'phaseCount': 2, 'phaseMode': 'split', 'state': 'disabled', 'statusFlags': list([ ]), }), ]), '/ivp/meters/readings': list([ dict({ 'actEnergyDlvd': 4545929.53, 'actEnergyRcvd': 0.637, 'activePower': 3624.573, 'apparentEnergy': 5375938.331, 'apparentPower': 3675.535, 'channels': list([ dict({ 'actEnergyDlvd': 2271793.63, 'actEnergyRcvd': 0.3, 'activePower': 1810.773, 'apparentEnergy': 2685521.244, 'apparentPower': 1836.021, 'current': 15.11, 'eid': 1778385169, 'freq': 60.0, 'instantaneousDemand': 1810.773, 'pwrFactor': 0.988, 'reactEnergyLagg': 365648.234, 'reactEnergyLead': 7490.926, 'reactivePower': 13.171, 'timestamp': 1694549733, 'voltage': 120.749, }), dict({ 'actEnergyDlvd': 2274135.9, 'actEnergyRcvd': 0.337, 'activePower': 1813.8, 'apparentEnergy': 2690417.087, 'apparentPower': 1839.514, 'current': 15.113, 'eid': 1778385170, 'freq': 60.0, 'instantaneousDemand': 1813.8, 'pwrFactor': 0.988, 'reactEnergyLagg': 364353.682, 'reactEnergyLead': 8559.662, 'reactivePower': 12.373, 'timestamp': 1694549733, 'voltage': 120.946, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 0.0, 'activePower': 0.0, 'apparentEnergy': 0.0, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385171, 'freq': 60.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 0.0, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1694549733, 'voltage': 0.0, }), ]), 'current': 30.223, 'eid': 704643328, 'freq': 60.0, 'instantaneousDemand': 3624.573, 'pwrFactor': 0.988, 'reactEnergyLagg': 730001.916, 'reactEnergyLead': 16050.589, 'reactivePower': 25.544, 'timestamp': 1694549733, 'voltage': 241.696, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 0.0, 'activePower': 0.0, 'apparentEnergy': 0.021, 'apparentPower': 34.651, 'channels': list([ dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 0.0, 'activePower': 0.0, 'apparentEnergy': 0.009, 'apparentPower': 15.201, 'current': 0.126, 'eid': 1778385425, 'freq': 60.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 0.0, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1694549733, 'voltage': 120.773, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 0.0, 'activePower': 0.0, 'apparentEnergy': 0.012, 'apparentPower': 19.45, 'current': 0.16, 'eid': 1778385426, 'freq': 60.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 0.0, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1694549733, 'voltage': 120.945, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 0.0, 'activePower': 0.0, 'apparentEnergy': 0.0, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385427, 'freq': 60.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 0.0, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1694549733, 'voltage': 0.0, }), ]), 'current': 0.287, 'eid': 704643584, 'freq': 60.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 0.0, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1694549733, 'voltage': 241.718, }), ]), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 0, 'apprntPwr': 7698.231, 'measurementType': 'total-consumption', 'pwrFactor': 0.49, 'reactPwr': -29.295, 'readingTime': 1694549731, 'rmsCurrent': 31.831, 'rmsVoltage': 241.85, 'type': 'eim', 'vahLifetime': 0.021, 'vahToday': 0.021, 'varhLagLifetime': 730001.895, 'varhLagToday': 730001.895, 'varhLeadLifetime': 16050.589, 'varhLeadToday': 16050.589, 'wNow': 3780.646, 'whLastSevenDays': 4545909.217, 'whLifetime': 4545909.217, 'whToday': 4545909.217, }), dict({ 'activeCount': 0, 'apprntPwr': 35.041, 'measurementType': 'net-consumption', 'pwrFactor': 0.0, 'reactPwr': 0.909, 'readingTime': 1694549731, 'rmsCurrent': 0.29, 'rmsVoltage': 241.9, 'type': 'eim', 'vahLifetime': 0.021, 'vahToday': 0, 'varhLagLifetime': 0.0, 'varhLagToday': 0, 'varhLeadLifetime': 0.0, 'varhLeadToday': 0, 'wNow': 0.0, 'whLastSevenDays': 0, 'whLifetime': 0.0, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 15, 'readingTime': 1694549655, 'type': 'inverters', 'wNow': 4085, 'whLifetime': 943236, }), dict({ 'activeCount': 1, 'apprntPwr': 3826.518, 'measurementType': 'production', 'pwrFactor': 0.99, 'reactPwr': 30.203, 'readingTime': 1694549731, 'rmsCurrent': 31.541, 'rmsVoltage': 241.801, 'type': 'eim', 'vahLifetime': 5375935.161, 'vahToday': 17699.161, 'varhLagLifetime': 730001.895, 'varhLagToday': 2831.895, 'varhLeadLifetime': 16050.589, 'varhLeadToday': 14.589, 'wNow': 3780.646, 'whLastSevenDays': 186010.403, 'whLifetime': 4545926.403, 'whToday': 14848.403, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': None, 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 186010, 'watt_hours_lifetime': 4545926, 'watt_hours_today': 14848, 'watts_now': 3781, }), 'system_production_phases': None, 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': '1680547193', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ ]), 'id': 'season_1', 'start': '1/1', 'tiers': list([ dict({ 'id': 'tier_1', 'limit': 1000, 'rate': 0.15128, }), dict({ 'id': 'tier_2', 'limit': -1, 'rate': 0.1585, }), ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.15128, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1680547193', 'mode': , 'operation_mode_sub_type': '', 'reserved_soc': 0.0, 'very_low_soc': 5, }), }), }) # --- # name: test_with_7_x_firmware[7.3.466_metered_disabled_cts] dict({ 'ctmeter_consumption': None, 'ctmeter_consumption_phases': None, 'ctmeter_production': None, 'ctmeter_production_phases': None, 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ }), 'dry_contact_status': dict({ }), 'encharge_aggregate': None, 'encharge_inventory': None, 'encharge_power': None, 'enpower': None, 'inverters': dict({ '121823030072': dict({ 'last_report_date': 1693745036, 'last_report_watts': 58, 'max_report_watts': 253, 'serial_number': '121823030072', }), '121823035149': dict({ 'last_report_date': 1693745066, 'last_report_watts': 56, 'max_report_watts': 254, 'serial_number': '121823035149', }), '482243031579': dict({ 'last_report_date': 1693744825, 'last_report_watts': 135, 'max_report_watts': 365, 'serial_number': '482243031579', }), '482243032888': dict({ 'last_report_date': 1693744828, 'last_report_watts': 133, 'max_report_watts': 365, 'serial_number': '482243032888', }), '482243032889': dict({ 'last_report_date': 1693744946, 'last_report_watts': 112, 'max_report_watts': 365, 'serial_number': '482243032889', }), '482243033444': dict({ 'last_report_date': 1693744829, 'last_report_watts': 127, 'max_report_watts': 365, 'serial_number': '482243033444', }), '482250079070': dict({ 'last_report_date': 1693744828, 'last_report_watts': 130, 'max_report_watts': 365, 'serial_number': '482250079070', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'battery_mode': 'self-consumption', 'charge_from_grid': False, 'date': '2023-06-29 15:50:12 UTC', 'operation_mode_sub_type': '', 'override': False, 'override_backup_soc': 30.0, 'override_chg_dischg_rate': 0.0, 'override_tou_mode': 'StorageTouMode_DEFAULT_TOU_MODE', 'reserved_soc': 0.0, 'schedule': dict({ 'Disable': list([ dict({ 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), ]), 'tariff': list([ dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'end': '1/1', 'start': '1/1', }), ]), }), 'source': 'Tariff', 'version': '00.00.02', 'very_low_soc': 5, }), 'tariff': dict({ 'currency': dict({ 'code': 'EUR', }), 'date': '1688053811', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'all_days', 'must_charge_duration': 0, 'must_charge_mode': 'CG', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.14, 'start': 480, }), dict({ 'id': 'filler', 'rate': 0.01, 'start': 1320, }), ]), }), ]), 'id': 'all_year_long', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.01, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1688053811', 'mode': 'self-consumption', 'operation_mode_sub_type': '', 'reserved_soc': 0.0, 'very_low_soc': 5, }), }), }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1693745036, 'lastReportWatts': 58, 'maxReportWatts': 253, 'serialNumber': '121823030072', }), dict({ 'devType': 1, 'lastReportDate': 1693745066, 'lastReportWatts': 56, 'maxReportWatts': 254, 'serialNumber': '121823035149', }), dict({ 'devType': 1, 'lastReportDate': 1693744825, 'lastReportWatts': 135, 'maxReportWatts': 365, 'serialNumber': '482243031579', }), dict({ 'devType': 1, 'lastReportDate': 1693744828, 'lastReportWatts': 133, 'maxReportWatts': 365, 'serialNumber': '482243032888', }), dict({ 'devType': 1, 'lastReportDate': 1693744828, 'lastReportWatts': 130, 'maxReportWatts': 365, 'serialNumber': '482250079070', }), dict({ 'devType': 1, 'lastReportDate': 1693744829, 'lastReportWatts': 127, 'maxReportWatts': 365, 'serialNumber': '482243033444', }), dict({ 'devType': 1, 'lastReportDate': 1693744946, 'lastReportWatts': 112, 'maxReportWatts': 365, 'serialNumber': '482243032889', }), ]), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 0, 'apprntPwr': -144.999, 'measurementType': 'total-consumption', 'pwrFactor': 1.0, 'reactPwr': -456.848, 'readingTime': 1693745129, 'rmsCurrent': -0.615, 'rmsVoltage': 235.743, 'type': 'eim', 'vahLifetime': 7252190.009, 'vahToday': 22904.009, 'varhLagLifetime': -591341.987, 'varhLagToday': 0.0, 'varhLeadLifetime': 3174026.446, 'varhLeadToday': 9602.446, 'wNow': 476.686, 'whLastSevenDays': 4.621, 'whLifetime': 5145153.621, 'whToday': 19903.621, }), dict({ 'activeCount': 0, 'apprntPwr': -654.785, 'measurementType': 'net-consumption', 'pwrFactor': -1.0, 'reactPwr': -572.697, 'readingTime': 1693745129, 'rmsCurrent': -2.778, 'rmsVoltage': 235.743, 'type': 'eim', 'vahLifetime': 7252190.009, 'vahToday': 0, 'varhLagLifetime': 251.885, 'varhLagToday': 0, 'varhLeadLifetime': 3174026.466, 'varhLeadToday': 0, 'wNow': -11.468, 'whLastSevenDays': 0, 'whLifetime': 1961512.786, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 7, 'readingTime': 1693745066, 'type': 'inverters', 'wNow': 751, 'whLifetime': 702919, }), dict({ 'activeCount': 0, 'apprntPwr': 509.902, 'measurementType': 'production', 'pwrFactor': 0.97, 'reactPwr': 115.849, 'readingTime': 1693745129, 'rmsCurrent': 2.162, 'rmsVoltage': 235.777, 'type': 'eim', 'vahLifetime': 3576166.777, 'vahToday': 5461.777, 'varhLagLifetime': 591593.872, 'varhLagToday': 1483.872, 'varhLeadLifetime': 0.021, 'varhLeadToday': 0.021, 'wNow': 488.154, 'whLastSevenDays': 111093.303, 'whLifetime': 3183793.303, 'whToday': 4425.303, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': None, 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 111093, 'watt_hours_lifetime': 702919, 'watt_hours_today': 4425, 'watts_now': 751, }), 'system_production_phases': None, 'tariff': dict({ 'currency': dict({ 'code': 'EUR', }), 'date': '1688053811', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'all_days', 'must_charge_duration': 0, 'must_charge_mode': 'CG', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.14, 'start': 480, }), dict({ 'id': 'filler', 'rate': 0.01, 'start': 1320, }), ]), }), ]), 'id': 'all_year_long', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.01, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1688053811', 'mode': , 'operation_mode_sub_type': '', 'reserved_soc': 0.0, 'very_low_soc': 5, }), }), }) # --- # name: test_with_7_x_firmware[7.3.466_with_cts_3phase] dict({ 'ctmeter_consumption': dict({ 'active_power': -36, 'current': 2.745, 'eid': 704643584, 'energy_delivered': 3738205, 'energy_received': 1776769, 'frequency': 50.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': -0.06, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 235.201, }), 'ctmeter_consumption_phases': dict({ : dict({ 'active_power': -36, 'current': 2.745, 'eid': 1778385425, 'energy_delivered': 3738205, 'energy_received': 1776769, 'frequency': 50.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': -0.06, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 235.201, }), : dict({ 'active_power': 0, 'current': 0.0, 'eid': 1778385426, 'energy_delivered': 0, 'energy_received': 8279, 'frequency': 50.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': -1.0, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 2.981, }), : dict({ 'active_power': 0, 'current': 0.242, 'eid': 1778385427, 'energy_delivered': 0, 'energy_received': 13980, 'frequency': 50.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': 0.0, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 4.635, }), }), 'ctmeter_production': dict({ 'active_power': 489, 'current': 2.169, 'eid': 704643328, 'energy_delivered': 3183794, 'energy_received': 8852, 'frequency': 50.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.957, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 235.236, }), 'ctmeter_production_phases': dict({ : dict({ 'active_power': 489, 'current': 2.169, 'eid': 1778385169, 'energy_delivered': 3183794, 'energy_received': 8852, 'frequency': 50.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.957, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 235.236, }), : dict({ 'active_power': 0, 'current': 0.0, 'eid': 1778385170, 'energy_delivered': 0, 'energy_received': 5371, 'frequency': 50.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.0, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 6.124, }), : dict({ 'active_power': -1, 'current': 0.227, 'eid': 1778385171, 'energy_delivered': 0, 'energy_received': 9818, 'frequency': 50.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': -1.0, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 11.469, }), }), 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ }), 'dry_contact_status': dict({ }), 'encharge_aggregate': None, 'encharge_inventory': None, 'encharge_power': None, 'enpower': None, 'inverters': dict({ '121212121201': dict({ 'last_report_date': 1693745036, 'last_report_watts': 58, 'max_report_watts': 253, 'serial_number': '121212121201', }), '121212121202': dict({ 'last_report_date': 1693745066, 'last_report_watts': 56, 'max_report_watts': 254, 'serial_number': '121212121202', }), '121212121203': dict({ 'last_report_date': 1693744825, 'last_report_watts': 135, 'max_report_watts': 365, 'serial_number': '121212121203', }), '121212121204': dict({ 'last_report_date': 1693744828, 'last_report_watts': 133, 'max_report_watts': 365, 'serial_number': '121212121204', }), '121212121205': dict({ 'last_report_date': 1693744828, 'last_report_watts': 130, 'max_report_watts': 365, 'serial_number': '121212121205', }), '121212121206': dict({ 'last_report_date': 1693744829, 'last_report_watts': 127, 'max_report_watts': 365, 'serial_number': '121212121206', }), '121212121207': dict({ 'last_report_date': 1693744946, 'last_report_watts': 112, 'max_report_watts': 365, 'serial_number': '121212121207', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'battery_mode': 'self-consumption', 'charge_from_grid': False, 'date': '2023-06-29 15:50:12 UTC', 'operation_mode_sub_type': '', 'override': False, 'override_backup_soc': 30, 'override_chg_dischg_rate': 0, 'override_tou_mode': 'StorageTouMode_DEFAULT_TOU_MODE', 'reserved_soc': 0, 'schedule': dict({ 'Disable': list([ dict({ 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), ]), 'tariff': list([ dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'end': '1/1', 'start': '1/1', }), ]), }), 'source': 'Tariff', 'version': '00.00.02', 'very_low_soc': 5, }), 'tariff': dict({ 'currency': dict({ 'code': 'EUR', }), 'date': '1688053811', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'all_days', 'must_charge_duration': 0, 'must_charge_mode': 'CG', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.14, 'start': 480, }), dict({ 'id': 'filler', 'rate': 0.01, 'start': 1320, }), ]), }), ]), 'id': 'all_year_long', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.01, 'sell': 0, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1688053811', 'mode': 'self-consumption', 'operation_mode_sub_type': '', 'reserved_soc': 0, 'very_low_soc': 5, }), }), }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1693745036, 'lastReportWatts': 58, 'maxReportWatts': 253, 'serialNumber': '121212121201', }), dict({ 'devType': 1, 'lastReportDate': 1693745066, 'lastReportWatts': 56, 'maxReportWatts': 254, 'serialNumber': '121212121202', }), dict({ 'devType': 1, 'lastReportDate': 1693744825, 'lastReportWatts': 135, 'maxReportWatts': 365, 'serialNumber': '121212121203', }), dict({ 'devType': 1, 'lastReportDate': 1693744828, 'lastReportWatts': 133, 'maxReportWatts': 365, 'serialNumber': '121212121204', }), dict({ 'devType': 1, 'lastReportDate': 1693744828, 'lastReportWatts': 130, 'maxReportWatts': 365, 'serialNumber': '121212121205', }), dict({ 'devType': 1, 'lastReportDate': 1693744829, 'lastReportWatts': 127, 'maxReportWatts': 365, 'serialNumber': '121212121206', }), dict({ 'devType': 1, 'lastReportDate': 1693744946, 'lastReportWatts': 112, 'maxReportWatts': 365, 'serialNumber': '121212121207', }), ]), '/ivp/meters': list([ dict({ 'eid': 704643328, 'measurementType': 'production', 'meteringStatus': 'normal', 'phaseCount': 3, 'phaseMode': 'three', 'state': 'enabled', 'statusFlags': list([ ]), }), dict({ 'eid': 704643584, 'measurementType': 'net-consumption', 'meteringStatus': 'normal', 'phaseCount': 3, 'phaseMode': 'three', 'state': 'enabled', 'statusFlags': list([ ]), }), ]), '/ivp/meters/readings': list([ dict({ 'actEnergyDlvd': 3183793.885, 'actEnergyRcvd': 8851.704, 'activePower': 488.925, 'apparentEnergy': 3576167.385, 'apparentPower': 510.003, 'channels': list([ dict({ 'actEnergyDlvd': 3183793.885, 'actEnergyRcvd': 8851.704, 'activePower': 488.925, 'apparentEnergy': 3576167.385, 'apparentPower': 510.003, 'current': 2.169, 'eid': 1778385169, 'freq': 50.0, 'instantaneousDemand': 488.925, 'pwrFactor': 0.957, 'reactEnergyLagg': 591594.008, 'reactEnergyLead': 0.021, 'reactivePower': 114.596, 'timestamp': 1693745133, 'voltage': 235.236, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 5370.79, 'activePower': 0.0, 'apparentEnergy': 295.364, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385170, 'freq': 50.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 387.143, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1693745133, 'voltage': 6.124, }), dict({ 'actEnergyDlvd': 0.022, 'actEnergyRcvd': 9818.109, 'activePower': -1.044, 'apparentEnergy': 14032.684, 'apparentPower': 2.602, 'current': 0.227, 'eid': 1778385171, 'freq': 50.0, 'instantaneousDemand': -1.044, 'pwrFactor': -1.0, 'reactEnergyLagg': 391.775, 'reactEnergyLead': 2.189, 'reactivePower': -0.0, 'timestamp': 1693745133, 'voltage': 11.469, }), ]), 'current': 2.169, 'eid': 704643328, 'freq': 50.0, 'instantaneousDemand': 488.925, 'pwrFactor': 0.957, 'reactEnergyLagg': 591594.008, 'reactEnergyLead': 0.021, 'reactivePower': 114.596, 'timestamp': 1693745133, 'voltage': 235.236, }), dict({ 'actEnergyDlvd': 3738205.282, 'actEnergyRcvd': 1776768.769, 'activePower': -36.162, 'apparentEnergy': 7252190.779, 'apparentPower': 645.376, 'channels': list([ dict({ 'actEnergyDlvd': 3738205.282, 'actEnergyRcvd': 1776768.769, 'activePower': -36.162, 'apparentEnergy': 7252190.779, 'apparentPower': 645.376, 'current': 2.745, 'eid': 1778385425, 'freq': 50.0, 'instantaneousDemand': -36.162, 'pwrFactor': -0.06, 'reactEnergyLagg': 251.885, 'reactEnergyLead': 3174027.145, 'reactivePower': -568.304, 'timestamp': 1693745133, 'voltage': 235.201, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 8279.267, 'activePower': -0.0, 'apparentEnergy': 141.429, 'apparentPower': -0.0, 'current': 0.0, 'eid': 1778385426, 'freq': 50.0, 'instantaneousDemand': -0.0, 'pwrFactor': -1.0, 'reactEnergyLagg': 378.426, 'reactEnergyLead': 0.181, 'reactivePower': 0.0, 'timestamp': 1693745133, 'voltage': 2.981, }), dict({ 'actEnergyDlvd': 0.013, 'actEnergyRcvd': 13980.174, 'activePower': -0.451, 'apparentEnergy': 6016.263, 'apparentPower': 1.128, 'current': 0.242, 'eid': 1778385427, 'freq': 50.0, 'instantaneousDemand': -0.451, 'pwrFactor': 0.0, 'reactEnergyLagg': 380.215, 'reactEnergyLead': 1.245, 'reactivePower': 0.0, 'timestamp': 1693745133, 'voltage': 4.635, }), ]), 'current': 2.745, 'eid': 704643584, 'freq': 50.0, 'instantaneousDemand': -36.162, 'pwrFactor': -0.06, 'reactEnergyLagg': 251.885, 'reactEnergyLead': 3174027.145, 'reactivePower': -568.304, 'timestamp': 1693745133, 'voltage': 235.201, }), ]), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 1, 'apprntPwr': 1929.904, 'lines': list([ dict({ 'apprntPwr': 306.73, 'pwrFactor': 0.29, 'reactPwr': -257.565, 'rmsCurrent': 1.295, 'rmsVoltage': 236.836, 'vahLifetime': 4268391.905, 'vahToday': 10866.905, 'varhLagLifetime': 578414.935, 'varhLagToday': 1188.935, 'varhLeadLifetime': 2114284.979, 'varhLeadToday': 4108.979, 'wNow': 88.573, 'whLastSevenDays': 39391.928, 'whLifetime': 2293782.928, 'whToday': 8584.928, }), dict({ 'apprntPwr': 204.919, 'pwrFactor': 0.6, 'reactPwr': -132.184, 'rmsCurrent': 0.861, 'rmsVoltage': 237.934, 'vahLifetime': 2331874.944, 'vahToday': 4293.944, 'varhLagLifetime': 383807.966, 'varhLagToday': 815.966, 'varhLeadLifetime': 1059082.625, 'varhLeadToday': 2783.625, 'wNow': 123.364, 'whLastSevenDays': 18948.969, 'whLifetime': 948057.969, 'whToday': 2154.969, }), dict({ 'apprntPwr': 131.213, 'pwrFactor': -0.02, 'reactPwr': -75.026, 'rmsCurrent': 0.551, 'rmsVoltage': 237.956, 'vahLifetime': 2134819.346, 'vahToday': 3787.346, 'varhLagLifetime': 379329.532, 'varhLagToday': 797.532, 'varhLeadLifetime': 763032.665, 'varhLeadToday': 1331.665, 'wNow': -2.853, 'whLastSevenDays': 10443.471, 'whLifetime': 832954.471, 'whToday': 1683.471, }), ]), 'measurementType': 'total-consumption', 'pwrFactor': 0.11, 'reactPwr': -464.776, 'readingTime': 1693433002, 'rmsCurrent': 2.708, 'rmsVoltage': 712.725, 'type': 'eim', 'vahLifetime': 8735086.195, 'vahToday': 18948.195, 'varhLagLifetime': 1341552.434, 'varhLagToday': 2802.434, 'varhLeadLifetime': 3936400.269, 'varhLeadToday': 8224.269, 'wNow': 209.084, 'whLastSevenDays': 68784.368, 'whLifetime': 4074795.368, 'whToday': 12423.368, }), dict({ 'activeCount': 1, 'apprntPwr': 487.922, 'lines': list([ dict({ 'apprntPwr': 238.691, 'pwrFactor': 0.41, 'reactPwr': -206.71, 'rmsCurrent': 1.009, 'rmsVoltage': 236.905, 'vahLifetime': 4268391.905, 'vahToday': 0, 'varhLagLifetime': 38719.874, 'varhLagToday': 0, 'varhLeadLifetime': 2114284.977, 'varhLeadToday': 0, 'wNow': 91.437, 'whLastSevenDays': 0, 'whLifetime': 1625201.414, 'whToday': 0, }), dict({ 'apprntPwr': 206.35, 'pwrFactor': 0.61, 'reactPwr': -132.184, 'rmsCurrent': 0.861, 'rmsVoltage': 237.949, 'vahLifetime': 2331874.944, 'vahToday': 0, 'varhLagLifetime': 16968.583, 'varhLagToday': 0, 'varhLeadLifetime': 1059082.624, 'varhLeadToday': 0, 'wNow': 123.364, 'whLastSevenDays': 0, 'whLifetime': 629892.171, 'whToday': 0, }), dict({ 'apprntPwr': 42.881, 'pwrFactor': 0.0, 'reactPwr': -41.336, 'rmsCurrent': 0.179, 'rmsVoltage': 238.007, 'vahLifetime': 2134819.346, 'vahToday': 0, 'varhLagLifetime': 20983.605, 'varhLagToday': 0, 'varhLeadLifetime': 763032.663, 'varhLeadToday': 0, 'wNow': 0.764, 'whLastSevenDays': 0, 'whLifetime': 631468.875, 'whToday': 0, }), ]), 'measurementType': 'net-consumption', 'pwrFactor': 0.46, 'reactPwr': -380.23, 'readingTime': 1693433002, 'rmsCurrent': 2.05, 'rmsVoltage': 712.862, 'type': 'eim', 'vahLifetime': 8735086.195, 'vahToday': 0, 'varhLagLifetime': 76672.062, 'varhLagToday': 0, 'varhLeadLifetime': 3936400.264, 'varhLeadToday': 0, 'wNow': 215.565, 'whLastSevenDays': 0, 'whLifetime': 2886562.459, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 7, 'readingTime': 0, 'type': 'inverters', 'wNow': 0, 'whLifetime': 4339764, }), dict({ 'activeCount': 1, 'apprntPwr': 156.055, 'lines': list([ dict({ 'apprntPwr': 67.699, 'pwrFactor': 0.0, 'reactPwr': 50.856, 'rmsCurrent': 0.286, 'rmsVoltage': 236.766, 'vahLifetime': 2377390.886, 'vahToday': 3576.886, 'varhLagLifetime': 539695.061, 'varhLagToday': 1163.061, 'varhLeadLifetime': 0.002, 'varhLeadToday': 0.002, 'wNow': -2.864, 'whLastSevenDays': 29891.394, 'whLifetime': 1869678.394, 'whToday': 2200.394, }), dict({ 'apprntPwr': -0.0, 'pwrFactor': 0.0, 'reactPwr': 0.0, 'rmsCurrent': -0.0, 'rmsVoltage': 237.918, 'vahLifetime': 1241038.844, 'vahToday': 1528.844, 'varhLagLifetime': 366839.383, 'varhLagToday': 792.383, 'varhLeadLifetime': 0.001, 'varhLeadToday': 0.001, 'wNow': 0.0, 'whLastSevenDays': 19793.645, 'whLifetime': 1241245.645, 'whToday': 1454.645, }), dict({ 'apprntPwr': 88.355, 'pwrFactor': 0.0, 'reactPwr': 33.69, 'rmsCurrent': 0.372, 'rmsVoltage': 237.904, 'vahLifetime': 1941098.256, 'vahToday': 3191.256, 'varhLagLifetime': 358345.928, 'varhLagToday': 771.928, 'varhLeadLifetime': 0.002, 'varhLeadToday': 0.002, 'wNow': -3.617, 'whLastSevenDays': 19807.161, 'whLifetime': 1240189.161, 'whToday': 1458.161, }), ]), 'measurementType': 'production', 'pwrFactor': 0.0, 'reactPwr': 84.546, 'readingTime': 1693433002, 'rmsCurrent': 0.658, 'rmsVoltage': 712.588, 'type': 'eim', 'vahLifetime': 5559527.987, 'vahToday': 8296.987, 'varhLagLifetime': 1264880.372, 'varhLagToday': 2727.372, 'varhLeadLifetime': 0.005, 'varhLeadToday': 0.005, 'wNow': -6.481, 'whLastSevenDays': 69492.2, 'whLifetime': 4351113.2, 'whToday': 5113.2, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': dict({ 'watt_hours_last_7_days': 68784, 'watt_hours_lifetime': 4074795, 'watt_hours_today': 12423, 'watts_now': 209, }), 'system_consumption_phases': dict({ : dict({ 'watt_hours_last_7_days': 39392, 'watt_hours_lifetime': 2293783, 'watt_hours_today': 8585, 'watts_now': 89, }), : dict({ 'watt_hours_last_7_days': 18949, 'watt_hours_lifetime': 948058, 'watt_hours_today': 2155, 'watts_now': 123, }), : dict({ 'watt_hours_last_7_days': 10443, 'watt_hours_lifetime': 832954, 'watt_hours_today': 1683, 'watts_now': -3, }), }), 'system_production': dict({ 'watt_hours_last_7_days': 69492, 'watt_hours_lifetime': 4351113, 'watt_hours_today': 5113, 'watts_now': -6, }), 'system_production_phases': dict({ : dict({ 'watt_hours_last_7_days': 29891, 'watt_hours_lifetime': 1869678, 'watt_hours_today': 2200, 'watts_now': -3, }), : dict({ 'watt_hours_last_7_days': 19794, 'watt_hours_lifetime': 1241246, 'watt_hours_today': 1455, 'watts_now': 0, }), : dict({ 'watt_hours_last_7_days': 19807, 'watt_hours_lifetime': 1240189, 'watt_hours_today': 1458, 'watts_now': -4, }), }), 'tariff': dict({ 'currency': dict({ 'code': 'EUR', }), 'date': '1688053811', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'all_days', 'must_charge_duration': 0, 'must_charge_mode': 'CG', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.14, 'start': 480, }), dict({ 'id': 'filler', 'rate': 0.01, 'start': 1320, }), ]), }), ]), 'id': 'all_year_long', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.01, 'sell': 0, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1688053811', 'mode': , 'operation_mode_sub_type': '', 'reserved_soc': 0, 'very_low_soc': 5, }), }), }) # --- # name: test_with_7_x_firmware[7.3.517] dict({ 'ctmeter_consumption': None, 'ctmeter_consumption_phases': None, 'ctmeter_production': None, 'ctmeter_production_phases': None, 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ 'NC1': dict({ 'black_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'generator_action': , 'grid_action': , 'id': 'NC1', 'load_name': 'NC1 Test', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': True, 'priority': 1.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 25.0, 'type': , }), 'NC2': dict({ 'black_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'generator_action': , 'grid_action': , 'id': 'NC2', 'load_name': 'NC2', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': True, 'priority': 2.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), 'NO1': dict({ 'black_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'generator_action': , 'grid_action': , 'id': 'NO1', 'load_name': 'No1', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': True, 'priority': 3.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), 'NO2': dict({ 'black_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'generator_action': , 'grid_action': , 'id': 'NO2', 'load_name': 'NO2', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': True, 'priority': 4.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), }), 'dry_contact_status': dict({ 'NC1': dict({ 'id': 'NC1', 'status': , }), 'NC2': dict({ 'id': 'NC2', 'status': , }), 'NO1': dict({ 'id': 'NO1', 'status': , }), 'NO2': dict({ 'id': 'NO2', 'status': , }), }), 'encharge_aggregate': dict({ 'available_energy': 10080, 'backup_reserve': 10080, 'configured_reserve_state_of_charge': 100, 'max_available_capacity': 10080, 'reserve_state_of_charge': 100, 'state_of_charge': 100, }), 'encharge_inventory': dict({ '122035013273': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '2.1.27', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 3360, 'encharge_revision': 1, 'firmware_loaded_date': 1692651649, 'firmware_version': '2.0.5663_rel/22.13', 'installed_date': 1692651649, 'last_report_date': 1692817971, 'led_status': 14, 'max_cell_temp': 28, 'operating': True, 'part_number': '830-00703-r67', 'percent_full': 100, 'serial_number': '122035013273', 'temperature': 28, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': '100B', }), '122035013278': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '2.1.27', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 3360, 'encharge_revision': 1, 'firmware_loaded_date': 1692651650, 'firmware_version': '2.0.5663_rel/22.13', 'installed_date': 1692651650, 'last_report_date': 1692817716, 'led_status': 14, 'max_cell_temp': 29, 'operating': True, 'part_number': '830-00703-r67', 'percent_full': 100, 'serial_number': '122035013278', 'temperature': 28, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': '100B', }), '122035013286': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '2.1.27', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 3360, 'encharge_revision': 1, 'firmware_loaded_date': 1692779890, 'firmware_version': '2.0.5663_rel/22.13', 'installed_date': 1692779890, 'last_report_date': 1692817944, 'led_status': 14, 'max_cell_temp': 29, 'operating': True, 'part_number': '830-00703-r67', 'percent_full': 100, 'serial_number': '122035013286', 'temperature': 28, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': '100B', }), }), 'encharge_power': dict({ '122035013273': dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'soc': 100, }), '122035013278': dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'soc': 100, }), '122035013286': dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'soc': 100, }), }), 'enpower': dict({ 'admin_state': 24, 'admin_state_str': 'ENPWR_STATE_OPER_CLOSED', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'firmware_loaded_date': 1692651723, 'firmware_version': '1.5.5229_rel/22.13', 'grid_mode': 'multimode-ongrid', 'installed_date': 1692651723, 'last_report_date': 1692817873, 'mains_admin_state': 'closed', 'mains_oper_state': 'closed', 'operating': True, 'part_number': '860-00276-r28', 'serial_number': '122029016399', 'temperature': 88, 'temperature_unit': 'F', 'zigbee_dongle_fw_version': '100B', }), 'inverters': dict({ '202042084581': dict({ 'last_report_date': 1692817988, 'last_report_watts': 199, 'max_report_watts': 245, 'serial_number': '202042084581', }), '202042085758': dict({ 'last_report_date': 1692817781, 'last_report_watts': 198, 'max_report_watts': 243, 'serial_number': '202042085758', }), '202043001326': dict({ 'last_report_date': 1692817929, 'last_report_watts': 205, 'max_report_watts': 244, 'serial_number': '202043001326', }), '202043001340': dict({ 'last_report_date': 1692817840, 'last_report_watts': 220, 'max_report_watts': 245, 'serial_number': '202043001340', }), '202043001781': dict({ 'last_report_date': 1692817838, 'last_report_watts': 218, 'max_report_watts': 245, 'serial_number': '202043001781', }), '202043002628': dict({ 'last_report_date': 1692817754, 'last_report_watts': 188, 'max_report_watts': 245, 'serial_number': '202043002628', }), '202043002631': dict({ 'last_report_date': 1692817819, 'last_report_watts': 212, 'max_report_watts': 243, 'serial_number': '202043002631', }), '202043002733': dict({ 'last_report_date': 1692817871, 'last_report_watts': 212, 'max_report_watts': 244, 'serial_number': '202043002733', }), '202043002762': dict({ 'last_report_date': 1692817752, 'last_report_watts': 186, 'max_report_watts': 244, 'serial_number': '202043002762', }), '202043002877': dict({ 'last_report_date': 1692817778, 'last_report_watts': 197, 'max_report_watts': 244, 'serial_number': '202043002877', }), '202043002943': dict({ 'last_report_date': 1692817753, 'last_report_watts': 187, 'max_report_watts': 242, 'serial_number': '202043002943', }), '202043003123': dict({ 'last_report_date': 1692817816, 'last_report_watts': 209, 'max_report_watts': 245, 'serial_number': '202043003123', }), '202043003256': dict({ 'last_report_date': 1692817841, 'last_report_watts': 218, 'max_report_watts': 245, 'serial_number': '202043003256', }), '202043003454': dict({ 'last_report_date': 1692817816, 'last_report_watts': 211, 'max_report_watts': 243, 'serial_number': '202043003454', }), '202043003467': dict({ 'last_report_date': 1692817748, 'last_report_watts': 186, 'max_report_watts': 245, 'serial_number': '202043003467', }), '202043003473': dict({ 'last_report_date': 1692817928, 'last_report_watts': 209, 'max_report_watts': 243, 'serial_number': '202043003473', }), '202043003484': dict({ 'last_report_date': 1692817869, 'last_report_watts': 213, 'max_report_watts': 244, 'serial_number': '202043003484', }), '202043003803': dict({ 'last_report_date': 1692817808, 'last_report_watts': 210, 'max_report_watts': 244, 'serial_number': '202043003803', }), '202106021181': dict({ 'last_report_date': 1692817958, 'last_report_watts': 204, 'max_report_watts': 243, 'serial_number': '202106021181', }), '202106046579': dict({ 'last_report_date': 1692817965, 'last_report_watts': 201, 'max_report_watts': 244, 'serial_number': '202106046579', }), '202106046737': dict({ 'last_report_date': 1692817754, 'last_report_watts': 187, 'max_report_watts': 244, 'serial_number': '202106046737', }), '202106049949': dict({ 'last_report_date': 1692817841, 'last_report_watts': 220, 'max_report_watts': 244, 'serial_number': '202106049949', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'battery_mode': 'backup', 'charge_from_grid': True, 'date': '2023-08-19 19:04:23 UTC', 'operation_mode_sub_type': '', 'override': False, 'override_backup_soc': 30.0, 'override_chg_dischg_rate': 0.0, 'override_tou_mode': 'StorageTouMode_DEFAULT_TOU_MODE', 'reserved_soc': 100.0, 'schedule': dict({ 'Disable': list([ dict({ 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), ]), 'tariff': list([ dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'Mon': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'Sat': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'Sun': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'Thu': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'Tue': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'Wed': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'end': '1/1', 'start': '1/1', }), ]), }), 'source': 'Tariff', 'version': '00.00.02', 'very_low_soc': 10, }), 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': '1692471808', 'logger': 'mylogger', 'seasons': list([ ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.0, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': True, 'date': '1692471808', 'mode': 'backup', 'operation_mode_sub_type': '', 'reserved_soc': 100.0, 'very_low_soc': 10, }), }), }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1692817928, 'lastReportWatts': 209, 'maxReportWatts': 243, 'serialNumber': '202043003473', }), dict({ 'devType': 1, 'lastReportDate': 1692817869, 'lastReportWatts': 213, 'maxReportWatts': 244, 'serialNumber': '202043003484', }), dict({ 'devType': 1, 'lastReportDate': 1692817778, 'lastReportWatts': 197, 'maxReportWatts': 244, 'serialNumber': '202043002877', }), dict({ 'devType': 1, 'lastReportDate': 1692817808, 'lastReportWatts': 210, 'maxReportWatts': 244, 'serialNumber': '202043003803', }), dict({ 'devType': 1, 'lastReportDate': 1692817838, 'lastReportWatts': 218, 'maxReportWatts': 245, 'serialNumber': '202043001781', }), dict({ 'devType': 1, 'lastReportDate': 1692817748, 'lastReportWatts': 186, 'maxReportWatts': 245, 'serialNumber': '202043003467', }), dict({ 'devType': 1, 'lastReportDate': 1692817929, 'lastReportWatts': 205, 'maxReportWatts': 244, 'serialNumber': '202043001326', }), dict({ 'devType': 1, 'lastReportDate': 1692817781, 'lastReportWatts': 198, 'maxReportWatts': 243, 'serialNumber': '202042085758', }), dict({ 'devType': 1, 'lastReportDate': 1692817958, 'lastReportWatts': 204, 'maxReportWatts': 243, 'serialNumber': '202106021181', }), dict({ 'devType': 1, 'lastReportDate': 1692817871, 'lastReportWatts': 212, 'maxReportWatts': 244, 'serialNumber': '202043002733', }), dict({ 'devType': 1, 'lastReportDate': 1692817752, 'lastReportWatts': 186, 'maxReportWatts': 244, 'serialNumber': '202043002762', }), dict({ 'devType': 1, 'lastReportDate': 1692817841, 'lastReportWatts': 220, 'maxReportWatts': 244, 'serialNumber': '202106049949', }), dict({ 'devType': 1, 'lastReportDate': 1692817753, 'lastReportWatts': 187, 'maxReportWatts': 242, 'serialNumber': '202043002943', }), dict({ 'devType': 1, 'lastReportDate': 1692817840, 'lastReportWatts': 220, 'maxReportWatts': 245, 'serialNumber': '202043001340', }), dict({ 'devType': 1, 'lastReportDate': 1692817754, 'lastReportWatts': 188, 'maxReportWatts': 245, 'serialNumber': '202043002628', }), dict({ 'devType': 1, 'lastReportDate': 1692817754, 'lastReportWatts': 187, 'maxReportWatts': 244, 'serialNumber': '202106046737', }), dict({ 'devType': 1, 'lastReportDate': 1692817841, 'lastReportWatts': 218, 'maxReportWatts': 245, 'serialNumber': '202043003256', }), dict({ 'devType': 1, 'lastReportDate': 1692817965, 'lastReportWatts': 201, 'maxReportWatts': 244, 'serialNumber': '202106046579', }), dict({ 'devType': 1, 'lastReportDate': 1692817988, 'lastReportWatts': 199, 'maxReportWatts': 245, 'serialNumber': '202042084581', }), dict({ 'devType': 1, 'lastReportDate': 1692817816, 'lastReportWatts': 211, 'maxReportWatts': 243, 'serialNumber': '202043003454', }), dict({ 'devType': 1, 'lastReportDate': 1692817816, 'lastReportWatts': 209, 'maxReportWatts': 245, 'serialNumber': '202043003123', }), dict({ 'devType': 1, 'lastReportDate': 1692817819, 'lastReportWatts': 212, 'maxReportWatts': 243, 'serialNumber': '202043002631', }), ]), '/ivp/ensemble/dry_contacts': dict({ 'dry_contacts': list([ dict({ 'id': 'NC1', 'status': 'closed', }), dict({ 'id': 'NC2', 'status': 'closed', }), dict({ 'id': 'NO1', 'status': 'closed', }), dict({ 'id': 'NO2', 'status': 'closed', }), ]), }), '/ivp/ensemble/inventory': list([ dict({ 'devices': list([ dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '2.1.27', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'created_date': 1692651649, 'dc_switch_off': False, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 3360, 'encharge_rev': 1, 'img_load_date': 1692651649, 'img_pnum_running': '2.0.5663_rel/22.13', 'installed': 1692651649, 'last_rpt_date': 1692817971, 'led_status': 14, 'maxCellTemp': 28, 'operating': True, 'part_num': '830-00703-r67', 'percentFull': 100, 'serial_num': '122035013273', 'sleep_enabled': False, 'temperature': 28, 'zigbee_dongle_fw_version': '100B', }), dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '2.1.27', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'created_date': 1692651650, 'dc_switch_off': False, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 3360, 'encharge_rev': 1, 'img_load_date': 1692651650, 'img_pnum_running': '2.0.5663_rel/22.13', 'installed': 1692651650, 'last_rpt_date': 1692817716, 'led_status': 14, 'maxCellTemp': 29, 'operating': True, 'part_num': '830-00703-r67', 'percentFull': 100, 'serial_num': '122035013278', 'sleep_enabled': False, 'temperature': 28, 'zigbee_dongle_fw_version': '100B', }), dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '2.1.27', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'created_date': 1692779890, 'dc_switch_off': False, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 3360, 'encharge_rev': 1, 'img_load_date': 1692779890, 'img_pnum_running': '2.0.5663_rel/22.13', 'installed': 1692779890, 'last_rpt_date': 1692817944, 'led_status': 14, 'maxCellTemp': 29, 'operating': True, 'part_num': '830-00703-r67', 'percentFull': 100, 'serial_num': '122035013286', 'sleep_enabled': False, 'temperature': 28, 'zigbee_dongle_fw_version': '100B', }), ]), 'type': 'ENCHARGE', }), dict({ 'devices': list([ dict({ 'Enchg_grid_mode': 'multimode-ongrid', 'Enpwr_curr_state_id': 16, 'Enpwr_grid_mode': 'multimode-ongrid', 'Enpwr_relay_state_bm': 15664, 'admin_state': 24, 'admin_state_str': 'ENPWR_STATE_OPER_CLOSED', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'created_date': 1692651723, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'img_load_date': 1692651723, 'img_pnum_running': '1.5.5229_rel/22.13', 'installed': 1692651723, 'last_rpt_date': 1692817873, 'mains_admin_state': 'closed', 'mains_oper_state': 'closed', 'operating': True, 'part_num': '860-00276-r28', 'serial_num': '122029016399', 'temperature': 88, 'zigbee_dongle_fw_version': '100B', }), ]), 'type': 'ENPOWER', }), ]), '/ivp/ensemble/power': dict({ 'devices:': list([ dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'serial_num': '122035013273', 'soc': 100, }), dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'serial_num': '122035013278', 'soc': 100, }), dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'serial_num': '122035013286', 'soc': 100, }), ]), }), '/ivp/ensemble/secctrl': dict({ 'ACB_agg_energy': 0, 'ACB_agg_soc': 0, 'ENC_agg_avail_energy': 10080, 'ENC_agg_backup_energy': 10080, 'ENC_agg_soc': 100, 'Enc_commissioned_capacity': 10080, 'Enc_max_available_capacity': 10080, 'Max_energy': 10080, 'adjusted_backup_soc': 100, 'agg_soc': 100, 'configured_backup_soc': 100, 'freq_bias_hz': -1.3200000524520874, 'freq_bias_hz_phaseb': 0.0, 'freq_bias_hz_phasec': 0.0, 'freq_bias_hz_q8': -2123, 'freq_bias_hz_q8_phaseb': 0, 'freq_bias_hz_q8_phasec': 0, 'shutdown': False, 'voltage_bias_v': -16.0, 'voltage_bias_v_phaseb': 0.0, 'voltage_bias_v_phasec': 0.0, 'voltage_bias_v_q5': -512, 'voltage_bias_v_q5_phaseb': 0, 'voltage_bias_v_q5_phasec': 0, }), '/ivp/ss/dry_contact_settings': dict({ 'dry_contacts': list([ dict({ 'black_s_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'gen_action': 'shed', 'grid_action': 'apply', 'id': 'NC1', 'load_name': 'NC1 Test', 'manual_override': 'true', 'micro_grid_action': 'shed', 'mode': 'manual', 'override': 'true', 'priority': 1.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 25.0, 'type': 'LOAD', }), dict({ 'black_s_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'gen_action': 'shed', 'grid_action': 'apply', 'id': 'NC2', 'load_name': 'NC2', 'manual_override': 'true', 'micro_grid_action': 'shed', 'mode': 'manual', 'override': 'true', 'priority': 2.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'LOAD', }), dict({ 'black_s_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'gen_action': 'apply', 'grid_action': 'shed', 'id': 'NO1', 'load_name': 'No1', 'manual_override': 'true', 'micro_grid_action': 'apply', 'mode': 'manual', 'override': 'true', 'priority': 3.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'LOAD', }), dict({ 'black_s_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'gen_action': 'apply', 'grid_action': 'shed', 'id': 'NO2', 'load_name': 'NO2', 'manual_override': 'true', 'micro_grid_action': 'apply', 'mode': 'manual', 'override': 'true', 'priority': 4.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'LOAD', }), ]), }), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 1, 'apprntPwr': 3159.183, 'measurementType': 'total-consumption', 'pwrFactor': 1.0, 'reactPwr': 120.73, 'readingTime': 1692818014, 'rmsCurrent': 25.982, 'rmsVoltage': 243.198, 'type': 'eim', 'vahLifetime': 35703441.404, 'vahToday': 20422.404, 'varhLagLifetime': -9185383.698, 'varhLagToday': 0.0, 'varhLeadLifetime': 13182910.813, 'varhLeadToday': 8438.813, 'wNow': 3791.075, 'whLastSevenDays': 852.104, 'whLifetime': 27629799.104, 'whToday': 24292.104, }), dict({ 'activeCount': 1, 'apprntPwr': -1322.483, 'measurementType': 'net-consumption', 'pwrFactor': -1.0, 'reactPwr': -287.032, 'readingTime': 1692818014, 'rmsCurrent': -10.874, 'rmsVoltage': 243.198, 'type': 'eim', 'vahLifetime': 35703441.404, 'vahToday': 0, 'varhLagLifetime': 190188.018, 'varhLagToday': 0, 'varhLeadLifetime': 13182911.259, 'varhLeadToday': 0, 'wNow': -765.064, 'whLastSevenDays': 0, 'whLifetime': 8436418.891, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 22, 'readingTime': 1692817988, 'type': 'inverters', 'wNow': 4490, 'whLifetime': 183353, }), dict({ 'activeCount': 1, 'apprntPwr': 4646.052, 'measurementType': 'production', 'pwrFactor': 0.98, 'reactPwr': 407.762, 'readingTime': 1692818014, 'rmsCurrent': 36.856, 'rmsVoltage': 243.341, 'type': 'eim', 'vahLifetime': 25459515.173, 'vahToday': 22749.173, 'varhLagLifetime': 9375571.716, 'varhLagToday': 6529.716, 'varhLeadLifetime': 0.446, 'varhLeadToday': 0.446, 'wNow': 4556.139, 'whLastSevenDays': 218714.461, 'whLifetime': 19230313.461, 'whToday': 18633.461, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': dict({ 'watt_hours_last_7_days': 852, 'watt_hours_lifetime': 27629799, 'watt_hours_today': 24292, 'watts_now': 3791, }), 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 218714, 'watt_hours_lifetime': 19230313, 'watt_hours_today': 18633, 'watts_now': 4556, }), 'system_production_phases': None, 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': '1692471808', 'logger': 'mylogger', 'seasons': list([ ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.0, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': True, 'date': '1692471808', 'mode': , 'operation_mode_sub_type': '', 'reserved_soc': 100.0, 'very_low_soc': 10, }), }), }) # --- # name: test_with_7_x_firmware[7.3.517_legacy_savings_mode] dict({ 'ctmeter_consumption': None, 'ctmeter_consumption_phases': None, 'ctmeter_production': None, 'ctmeter_production_phases': None, 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ 'NC1': dict({ 'black_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'generator_action': , 'grid_action': , 'id': 'NC1', 'load_name': 'NC1 Test', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': True, 'priority': 1.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 25.0, 'type': , }), 'NC2': dict({ 'black_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'generator_action': , 'grid_action': , 'id': 'NC2', 'load_name': 'NC2', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': True, 'priority': 2.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), 'NO1': dict({ 'black_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'generator_action': , 'grid_action': , 'id': 'NO1', 'load_name': 'No1', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': True, 'priority': 3.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), 'NO2': dict({ 'black_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'generator_action': , 'grid_action': , 'id': 'NO2', 'load_name': 'NO2', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': True, 'priority': 4.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), }), 'dry_contact_status': dict({ 'NC1': dict({ 'id': 'NC1', 'status': , }), 'NC2': dict({ 'id': 'NC2', 'status': , }), 'NO1': dict({ 'id': 'NO1', 'status': , }), 'NO2': dict({ 'id': 'NO2', 'status': , }), }), 'encharge_aggregate': dict({ 'available_energy': 10080, 'backup_reserve': 10080, 'configured_reserve_state_of_charge': 100, 'max_available_capacity': 10080, 'reserve_state_of_charge': 100, 'state_of_charge': 100, }), 'encharge_inventory': dict({ '122035013273': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '2.1.27', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 3360, 'encharge_revision': 1, 'firmware_loaded_date': 1692651649, 'firmware_version': '2.0.5663_rel/22.13', 'installed_date': 1692651649, 'last_report_date': 1692817971, 'led_status': 14, 'max_cell_temp': 28, 'operating': True, 'part_number': '830-00703-r67', 'percent_full': 100, 'serial_number': '122035013273', 'temperature': 28, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': '100B', }), '122035013278': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '2.1.27', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 3360, 'encharge_revision': 1, 'firmware_loaded_date': 1692651650, 'firmware_version': '2.0.5663_rel/22.13', 'installed_date': 1692651650, 'last_report_date': 1692817716, 'led_status': 14, 'max_cell_temp': 29, 'operating': True, 'part_number': '830-00703-r67', 'percent_full': 100, 'serial_number': '122035013278', 'temperature': 28, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': '100B', }), '122035013286': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '2.1.27', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 3360, 'encharge_revision': 1, 'firmware_loaded_date': 1692779890, 'firmware_version': '2.0.5663_rel/22.13', 'installed_date': 1692779890, 'last_report_date': 1692817944, 'led_status': 14, 'max_cell_temp': 29, 'operating': True, 'part_number': '830-00703-r67', 'percent_full': 100, 'serial_number': '122035013286', 'temperature': 28, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': '100B', }), }), 'encharge_power': dict({ '122035013273': dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'soc': 100, }), '122035013278': dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'soc': 100, }), '122035013286': dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'soc': 100, }), }), 'enpower': dict({ 'admin_state': 24, 'admin_state_str': 'ENPWR_STATE_OPER_CLOSED', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'firmware_loaded_date': 1692651723, 'firmware_version': '1.5.5229_rel/22.13', 'grid_mode': 'multimode-ongrid', 'installed_date': 1692651723, 'last_report_date': 1692817873, 'mains_admin_state': 'closed', 'mains_oper_state': 'closed', 'operating': True, 'part_number': '860-00276-r28', 'serial_number': '122029016399', 'temperature': 88, 'temperature_unit': 'F', 'zigbee_dongle_fw_version': '100B', }), 'inverters': dict({ '202042084581': dict({ 'last_report_date': 1692817988, 'last_report_watts': 199, 'max_report_watts': 245, 'serial_number': '202042084581', }), '202042085758': dict({ 'last_report_date': 1692817781, 'last_report_watts': 198, 'max_report_watts': 243, 'serial_number': '202042085758', }), '202043001326': dict({ 'last_report_date': 1692817929, 'last_report_watts': 205, 'max_report_watts': 244, 'serial_number': '202043001326', }), '202043001340': dict({ 'last_report_date': 1692817840, 'last_report_watts': 220, 'max_report_watts': 245, 'serial_number': '202043001340', }), '202043001781': dict({ 'last_report_date': 1692817838, 'last_report_watts': 218, 'max_report_watts': 245, 'serial_number': '202043001781', }), '202043002628': dict({ 'last_report_date': 1692817754, 'last_report_watts': 188, 'max_report_watts': 245, 'serial_number': '202043002628', }), '202043002631': dict({ 'last_report_date': 1692817819, 'last_report_watts': 212, 'max_report_watts': 243, 'serial_number': '202043002631', }), '202043002733': dict({ 'last_report_date': 1692817871, 'last_report_watts': 212, 'max_report_watts': 244, 'serial_number': '202043002733', }), '202043002762': dict({ 'last_report_date': 1692817752, 'last_report_watts': 186, 'max_report_watts': 244, 'serial_number': '202043002762', }), '202043002877': dict({ 'last_report_date': 1692817778, 'last_report_watts': 197, 'max_report_watts': 244, 'serial_number': '202043002877', }), '202043002943': dict({ 'last_report_date': 1692817753, 'last_report_watts': 187, 'max_report_watts': 242, 'serial_number': '202043002943', }), '202043003123': dict({ 'last_report_date': 1692817816, 'last_report_watts': 209, 'max_report_watts': 245, 'serial_number': '202043003123', }), '202043003256': dict({ 'last_report_date': 1692817841, 'last_report_watts': 218, 'max_report_watts': 245, 'serial_number': '202043003256', }), '202043003454': dict({ 'last_report_date': 1692817816, 'last_report_watts': 211, 'max_report_watts': 243, 'serial_number': '202043003454', }), '202043003467': dict({ 'last_report_date': 1692817748, 'last_report_watts': 186, 'max_report_watts': 245, 'serial_number': '202043003467', }), '202043003473': dict({ 'last_report_date': 1692817928, 'last_report_watts': 209, 'max_report_watts': 243, 'serial_number': '202043003473', }), '202043003484': dict({ 'last_report_date': 1692817869, 'last_report_watts': 213, 'max_report_watts': 244, 'serial_number': '202043003484', }), '202043003803': dict({ 'last_report_date': 1692817808, 'last_report_watts': 210, 'max_report_watts': 244, 'serial_number': '202043003803', }), '202106021181': dict({ 'last_report_date': 1692817958, 'last_report_watts': 204, 'max_report_watts': 243, 'serial_number': '202106021181', }), '202106046579': dict({ 'last_report_date': 1692817965, 'last_report_watts': 201, 'max_report_watts': 244, 'serial_number': '202106046579', }), '202106046737': dict({ 'last_report_date': 1692817754, 'last_report_watts': 187, 'max_report_watts': 244, 'serial_number': '202106046737', }), '202106049949': dict({ 'last_report_date': 1692817841, 'last_report_watts': 220, 'max_report_watts': 244, 'serial_number': '202106049949', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'battery_mode': 'backup', 'charge_from_grid': True, 'date': '2023-08-19 19:04:23 UTC', 'operation_mode_sub_type': '', 'override': False, 'override_backup_soc': 30.0, 'override_chg_dischg_rate': 0.0, 'override_tou_mode': 'StorageTouMode_DEFAULT_TOU_MODE', 'reserved_soc': 100.0, 'schedule': dict({ 'Disable': list([ dict({ 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), ]), 'tariff': list([ dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'Mon': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'Sat': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'Sun': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'Thu': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'Tue': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'Wed': list([ dict({ 'duration': 1440, 'setting': 'CG', 'start': 0, }), ]), 'end': '1/1', 'start': '1/1', }), ]), }), 'source': 'Tariff', 'version': '00.00.02', 'very_low_soc': 10, }), 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': '1692471808', 'logger': 'mylogger', 'seasons': list([ ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.0, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': True, 'date': '1692471808', 'mode': 'savings-mode', 'operation_mode_sub_type': '', 'reserved_soc': 100.0, 'very_low_soc': 10, }), }), }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1692817928, 'lastReportWatts': 209, 'maxReportWatts': 243, 'serialNumber': '202043003473', }), dict({ 'devType': 1, 'lastReportDate': 1692817869, 'lastReportWatts': 213, 'maxReportWatts': 244, 'serialNumber': '202043003484', }), dict({ 'devType': 1, 'lastReportDate': 1692817778, 'lastReportWatts': 197, 'maxReportWatts': 244, 'serialNumber': '202043002877', }), dict({ 'devType': 1, 'lastReportDate': 1692817808, 'lastReportWatts': 210, 'maxReportWatts': 244, 'serialNumber': '202043003803', }), dict({ 'devType': 1, 'lastReportDate': 1692817838, 'lastReportWatts': 218, 'maxReportWatts': 245, 'serialNumber': '202043001781', }), dict({ 'devType': 1, 'lastReportDate': 1692817748, 'lastReportWatts': 186, 'maxReportWatts': 245, 'serialNumber': '202043003467', }), dict({ 'devType': 1, 'lastReportDate': 1692817929, 'lastReportWatts': 205, 'maxReportWatts': 244, 'serialNumber': '202043001326', }), dict({ 'devType': 1, 'lastReportDate': 1692817781, 'lastReportWatts': 198, 'maxReportWatts': 243, 'serialNumber': '202042085758', }), dict({ 'devType': 1, 'lastReportDate': 1692817958, 'lastReportWatts': 204, 'maxReportWatts': 243, 'serialNumber': '202106021181', }), dict({ 'devType': 1, 'lastReportDate': 1692817871, 'lastReportWatts': 212, 'maxReportWatts': 244, 'serialNumber': '202043002733', }), dict({ 'devType': 1, 'lastReportDate': 1692817752, 'lastReportWatts': 186, 'maxReportWatts': 244, 'serialNumber': '202043002762', }), dict({ 'devType': 1, 'lastReportDate': 1692817841, 'lastReportWatts': 220, 'maxReportWatts': 244, 'serialNumber': '202106049949', }), dict({ 'devType': 1, 'lastReportDate': 1692817753, 'lastReportWatts': 187, 'maxReportWatts': 242, 'serialNumber': '202043002943', }), dict({ 'devType': 1, 'lastReportDate': 1692817840, 'lastReportWatts': 220, 'maxReportWatts': 245, 'serialNumber': '202043001340', }), dict({ 'devType': 1, 'lastReportDate': 1692817754, 'lastReportWatts': 188, 'maxReportWatts': 245, 'serialNumber': '202043002628', }), dict({ 'devType': 1, 'lastReportDate': 1692817754, 'lastReportWatts': 187, 'maxReportWatts': 244, 'serialNumber': '202106046737', }), dict({ 'devType': 1, 'lastReportDate': 1692817841, 'lastReportWatts': 218, 'maxReportWatts': 245, 'serialNumber': '202043003256', }), dict({ 'devType': 1, 'lastReportDate': 1692817965, 'lastReportWatts': 201, 'maxReportWatts': 244, 'serialNumber': '202106046579', }), dict({ 'devType': 1, 'lastReportDate': 1692817988, 'lastReportWatts': 199, 'maxReportWatts': 245, 'serialNumber': '202042084581', }), dict({ 'devType': 1, 'lastReportDate': 1692817816, 'lastReportWatts': 211, 'maxReportWatts': 243, 'serialNumber': '202043003454', }), dict({ 'devType': 1, 'lastReportDate': 1692817816, 'lastReportWatts': 209, 'maxReportWatts': 245, 'serialNumber': '202043003123', }), dict({ 'devType': 1, 'lastReportDate': 1692817819, 'lastReportWatts': 212, 'maxReportWatts': 243, 'serialNumber': '202043002631', }), ]), '/ivp/ensemble/dry_contacts': dict({ 'dry_contacts': list([ dict({ 'id': 'NC1', 'status': 'closed', }), dict({ 'id': 'NC2', 'status': 'closed', }), dict({ 'id': 'NO1', 'status': 'closed', }), dict({ 'id': 'NO2', 'status': 'closed', }), ]), }), '/ivp/ensemble/inventory': list([ dict({ 'devices': list([ dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '2.1.27', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'created_date': 1692651649, 'dc_switch_off': False, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 3360, 'encharge_rev': 1, 'img_load_date': 1692651649, 'img_pnum_running': '2.0.5663_rel/22.13', 'installed': 1692651649, 'last_rpt_date': 1692817971, 'led_status': 14, 'maxCellTemp': 28, 'operating': True, 'part_num': '830-00703-r67', 'percentFull': 100, 'serial_num': '122035013273', 'sleep_enabled': False, 'temperature': 28, 'zigbee_dongle_fw_version': '100B', }), dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '2.1.27', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'created_date': 1692651650, 'dc_switch_off': False, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 3360, 'encharge_rev': 1, 'img_load_date': 1692651650, 'img_pnum_running': '2.0.5663_rel/22.13', 'installed': 1692651650, 'last_rpt_date': 1692817716, 'led_status': 14, 'maxCellTemp': 29, 'operating': True, 'part_num': '830-00703-r67', 'percentFull': 100, 'serial_num': '122035013278', 'sleep_enabled': False, 'temperature': 28, 'zigbee_dongle_fw_version': '100B', }), dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '2.1.27', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'created_date': 1692779890, 'dc_switch_off': False, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 3360, 'encharge_rev': 1, 'img_load_date': 1692779890, 'img_pnum_running': '2.0.5663_rel/22.13', 'installed': 1692779890, 'last_rpt_date': 1692817944, 'led_status': 14, 'maxCellTemp': 29, 'operating': True, 'part_num': '830-00703-r67', 'percentFull': 100, 'serial_num': '122035013286', 'sleep_enabled': False, 'temperature': 28, 'zigbee_dongle_fw_version': '100B', }), ]), 'type': 'ENCHARGE', }), dict({ 'devices': list([ dict({ 'Enchg_grid_mode': 'multimode-ongrid', 'Enpwr_curr_state_id': 16, 'Enpwr_grid_mode': 'multimode-ongrid', 'Enpwr_relay_state_bm': 15664, 'admin_state': 24, 'admin_state_str': 'ENPWR_STATE_OPER_CLOSED', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'created_date': 1692651723, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'img_load_date': 1692651723, 'img_pnum_running': '1.5.5229_rel/22.13', 'installed': 1692651723, 'last_rpt_date': 1692817873, 'mains_admin_state': 'closed', 'mains_oper_state': 'closed', 'operating': True, 'part_num': '860-00276-r28', 'serial_num': '122029016399', 'temperature': 88, 'zigbee_dongle_fw_version': '100B', }), ]), 'type': 'ENPOWER', }), ]), '/ivp/ensemble/power': dict({ 'devices:': list([ dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'serial_num': '122035013273', 'soc': 100, }), dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'serial_num': '122035013278', 'soc': 100, }), dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'serial_num': '122035013286', 'soc': 100, }), ]), }), '/ivp/ensemble/secctrl': dict({ 'ACB_agg_energy': 0, 'ACB_agg_soc': 0, 'ENC_agg_avail_energy': 10080, 'ENC_agg_backup_energy': 10080, 'ENC_agg_soc': 100, 'Enc_commissioned_capacity': 10080, 'Enc_max_available_capacity': 10080, 'Max_energy': 10080, 'adjusted_backup_soc': 100, 'agg_soc': 100, 'configured_backup_soc': 100, 'freq_bias_hz': -1.3200000524520874, 'freq_bias_hz_phaseb': 0.0, 'freq_bias_hz_phasec': 0.0, 'freq_bias_hz_q8': -2123, 'freq_bias_hz_q8_phaseb': 0, 'freq_bias_hz_q8_phasec': 0, 'shutdown': False, 'voltage_bias_v': -16.0, 'voltage_bias_v_phaseb': 0.0, 'voltage_bias_v_phasec': 0.0, 'voltage_bias_v_q5': -512, 'voltage_bias_v_q5_phaseb': 0, 'voltage_bias_v_q5_phasec': 0, }), '/ivp/ss/dry_contact_settings': dict({ 'dry_contacts': list([ dict({ 'black_s_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'gen_action': 'shed', 'grid_action': 'apply', 'id': 'NC1', 'load_name': 'NC1 Test', 'manual_override': 'true', 'micro_grid_action': 'shed', 'mode': 'manual', 'override': 'true', 'priority': 1.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 25.0, 'type': 'LOAD', }), dict({ 'black_s_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'gen_action': 'shed', 'grid_action': 'apply', 'id': 'NC2', 'load_name': 'NC2', 'manual_override': 'true', 'micro_grid_action': 'shed', 'mode': 'manual', 'override': 'true', 'priority': 2.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'LOAD', }), dict({ 'black_s_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'gen_action': 'apply', 'grid_action': 'shed', 'id': 'NO1', 'load_name': 'No1', 'manual_override': 'true', 'micro_grid_action': 'apply', 'mode': 'manual', 'override': 'true', 'priority': 3.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'LOAD', }), dict({ 'black_s_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'gen_action': 'apply', 'grid_action': 'shed', 'id': 'NO2', 'load_name': 'NO2', 'manual_override': 'true', 'micro_grid_action': 'apply', 'mode': 'manual', 'override': 'true', 'priority': 4.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'LOAD', }), ]), }), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 1, 'apprntPwr': 3159.183, 'measurementType': 'total-consumption', 'pwrFactor': 1.0, 'reactPwr': 120.73, 'readingTime': 1692818014, 'rmsCurrent': 25.982, 'rmsVoltage': 243.198, 'type': 'eim', 'vahLifetime': 35703441.404, 'vahToday': 20422.404, 'varhLagLifetime': -9185383.698, 'varhLagToday': 0.0, 'varhLeadLifetime': 13182910.813, 'varhLeadToday': 8438.813, 'wNow': 3791.075, 'whLastSevenDays': 852.104, 'whLifetime': 27629799.104, 'whToday': 24292.104, }), dict({ 'activeCount': 1, 'apprntPwr': -1322.483, 'measurementType': 'net-consumption', 'pwrFactor': -1.0, 'reactPwr': -287.032, 'readingTime': 1692818014, 'rmsCurrent': -10.874, 'rmsVoltage': 243.198, 'type': 'eim', 'vahLifetime': 35703441.404, 'vahToday': 0, 'varhLagLifetime': 190188.018, 'varhLagToday': 0, 'varhLeadLifetime': 13182911.259, 'varhLeadToday': 0, 'wNow': -765.064, 'whLastSevenDays': 0, 'whLifetime': 8436418.891, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 22, 'readingTime': 1692817988, 'type': 'inverters', 'wNow': 4490, 'whLifetime': 183353, }), dict({ 'activeCount': 1, 'apprntPwr': 4646.052, 'measurementType': 'production', 'pwrFactor': 0.98, 'reactPwr': 407.762, 'readingTime': 1692818014, 'rmsCurrent': 36.856, 'rmsVoltage': 243.341, 'type': 'eim', 'vahLifetime': 25459515.173, 'vahToday': 22749.173, 'varhLagLifetime': 9375571.716, 'varhLagToday': 6529.716, 'varhLeadLifetime': 0.446, 'varhLeadToday': 0.446, 'wNow': 4556.139, 'whLastSevenDays': 218714.461, 'whLifetime': 19230313.461, 'whToday': 18633.461, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': dict({ 'watt_hours_last_7_days': 852, 'watt_hours_lifetime': 27629799, 'watt_hours_today': 24292, 'watts_now': 3791, }), 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 218714, 'watt_hours_lifetime': 19230313, 'watt_hours_today': 18633, 'watts_now': 4556, }), 'system_production_phases': None, 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': '1692471808', 'logger': 'mylogger', 'seasons': list([ ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.0, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': True, 'date': '1692471808', 'mode': , 'operation_mode_sub_type': '', 'reserved_soc': 100.0, 'very_low_soc': 10, }), }), }) # --- # name: test_with_7_x_firmware[7.3.517_system_2] dict({ 'ctmeter_consumption': dict({ 'active_power': 23, 'current': 2.985, 'eid': 704643584, 'energy_delivered': 4873881, 'energy_received': 7554062, 'frequency': 60.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': 0.031, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1694553765, 'voltage': 245.008, }), 'ctmeter_consumption_phases': dict({ : dict({ 'active_power': -17, 'current': 1.18, 'eid': 1778385425, 'energy_delivered': 3374056, 'energy_received': 3340639, 'frequency': 60.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': -0.154, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1694553765, 'voltage': 122.634, }), : dict({ 'active_power': 41, 'current': 1.806, 'eid': 1778385426, 'energy_delivered': 1499825, 'energy_received': 4213423, 'frequency': 60.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': 0.15, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1694553765, 'voltage': 122.375, }), }), 'ctmeter_production': dict({ 'active_power': 2660, 'current': 21.736, 'eid': 704643328, 'energy_delivered': 18442497, 'energy_received': 0, 'frequency': 60.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 1.0, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1694553765, 'voltage': 244.845, }), 'ctmeter_production_phases': dict({ : dict({ 'active_power': 1331, 'current': 10.865, 'eid': 1778385169, 'energy_delivered': 9224605, 'energy_received': 0, 'frequency': 60.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 1.0, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1694553765, 'voltage': 122.565, }), : dict({ 'active_power': 1329, 'current': 10.871, 'eid': 1778385170, 'energy_delivered': 9217892, 'energy_received': 0, 'frequency': 60.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 1.0, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1694553765, 'voltage': 122.28, }), }), 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ 'NC1': dict({ 'black_start': None, 'essential_end_time': None, 'essential_start_time': None, 'generator_action': , 'grid_action': , 'id': 'NC1', 'load_name': '', 'manual_override': None, 'micro_grid_action': , 'mode': , 'override': False, 'priority': None, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), 'NC2': dict({ 'black_start': None, 'essential_end_time': None, 'essential_start_time': None, 'generator_action': , 'grid_action': , 'id': 'NC2', 'load_name': '', 'manual_override': None, 'micro_grid_action': , 'mode': , 'override': False, 'priority': None, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), 'NO1': dict({ 'black_start': None, 'essential_end_time': None, 'essential_start_time': None, 'generator_action': , 'grid_action': , 'id': 'NO1', 'load_name': '', 'manual_override': None, 'micro_grid_action': , 'mode': , 'override': False, 'priority': None, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), 'NO2': dict({ 'black_start': None, 'essential_end_time': None, 'essential_start_time': None, 'generator_action': , 'grid_action': , 'id': 'NO2', 'load_name': '', 'manual_override': None, 'micro_grid_action': , 'mode': , 'override': False, 'priority': None, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), }), 'dry_contact_status': dict({ 'NC1': dict({ 'id': 'NC1', 'status': , }), 'NC2': dict({ 'id': 'NC2', 'status': , }), 'NO1': dict({ 'id': 'NO1', 'status': , }), 'NO2': dict({ 'id': 'NO2', 'status': , }), }), 'encharge_aggregate': dict({ 'available_energy': 9710, 'backup_reserve': 2016, 'configured_reserve_state_of_charge': 20, 'max_available_capacity': 10080, 'reserve_state_of_charge': 20, 'state_of_charge': 96, }), 'encharge_inventory': dict({ '122031000212': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '2.1.27', 'comm_level_2_4_ghz': 3, 'comm_level_sub_ghz': 3, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 3360, 'encharge_revision': 1, 'firmware_loaded_date': 1693554929, 'firmware_version': '2.0.5663_rel/22.13', 'installed_date': 1693554929, 'last_report_date': 1694553651, 'led_status': 12, 'max_cell_temp': 25, 'operating': True, 'part_number': '830-00703-r64', 'percent_full': 96, 'serial_number': '122031000212', 'temperature': 25, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': '100B', }), '122031000215': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '2.1.27', 'comm_level_2_4_ghz': 3, 'comm_level_sub_ghz': 3, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 3360, 'encharge_revision': 1, 'firmware_loaded_date': 1693576648, 'firmware_version': '2.0.5663_rel/22.13', 'installed_date': 1693576648, 'last_report_date': 1694553547, 'led_status': 12, 'max_cell_temp': 26, 'operating': True, 'part_number': '830-00703-r64', 'percent_full': 97, 'serial_number': '122031000215', 'temperature': 25, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': '100B', }), '122031023943': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '2.1.27', 'comm_level_2_4_ghz': 4, 'comm_level_sub_ghz': 4, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 3360, 'encharge_revision': 1, 'firmware_loaded_date': 1694098472, 'firmware_version': '2.0.5663_rel/22.13', 'installed_date': 1694098472, 'last_report_date': 1694553574, 'led_status': 12, 'max_cell_temp': 26, 'operating': True, 'part_number': '830-00703-r64', 'percent_full': 96, 'serial_number': '122031023943', 'temperature': 25, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': '100B', }), }), 'encharge_power': dict({ '122031000212': dict({ 'apparent_power_mva': -676000, 'real_power_mw': -676000, 'soc': 96, }), '122031000215': dict({ 'apparent_power_mva': -680000, 'real_power_mw': -680000, 'soc': 97, }), '122031023943': dict({ 'apparent_power_mva': -676000, 'real_power_mw': -676000, 'soc': 96, }), }), 'enpower': dict({ 'admin_state': 24, 'admin_state_str': 'ENPWR_STATE_OPER_CLOSED', 'comm_level_2_4_ghz': 2, 'comm_level_sub_ghz': 2, 'communicating': True, 'firmware_loaded_date': 1688303357, 'firmware_version': '1.5.5229_rel/22.13', 'grid_mode': 'multimode-ongrid', 'installed_date': 1688303357, 'last_report_date': 1694553566, 'mains_admin_state': 'closed', 'mains_oper_state': 'closed', 'operating': True, 'part_number': '860-00276-r33', 'serial_number': '122036058363', 'temperature': 78, 'temperature_unit': 'F', 'zigbee_dongle_fw_version': '100B', }), 'inverters': dict({ '122004027913': dict({ 'last_report_date': 1694553576, 'last_report_watts': 230, 'max_report_watts': 296, 'serial_number': '122004027913', }), '122004028091': dict({ 'last_report_date': 1694553426, 'last_report_watts': 13, 'max_report_watts': 296, 'serial_number': '122004028091', }), '122004028206': dict({ 'last_report_date': 1694553697, 'last_report_watts': 129, 'max_report_watts': 295, 'serial_number': '122004028206', }), '122004028286': dict({ 'last_report_date': 1694553702, 'last_report_watts': 229, 'max_report_watts': 296, 'serial_number': '122004028286', }), '122004028288': dict({ 'last_report_date': 1694553606, 'last_report_watts': 263, 'max_report_watts': 296, 'serial_number': '122004028288', }), '122004028400': dict({ 'last_report_date': 1694553427, 'last_report_watts': 177, 'max_report_watts': 286, 'serial_number': '122004028400', }), '122004028989': dict({ 'last_report_date': 1694553456, 'last_report_watts': 266, 'max_report_watts': 296, 'serial_number': '122004028989', }), '122004028991': dict({ 'last_report_date': 1694553699, 'last_report_watts': 268, 'max_report_watts': 297, 'serial_number': '122004028991', }), '122004028996': dict({ 'last_report_date': 1694553546, 'last_report_watts': 232, 'max_report_watts': 296, 'serial_number': '122004028996', }), '122004031655': dict({ 'last_report_date': 1694553607, 'last_report_watts': 268, 'max_report_watts': 296, 'serial_number': '122004031655', }), '122004032100': dict({ 'last_report_date': 1694553549, 'last_report_watts': 170, 'max_report_watts': 244, 'serial_number': '122004032100', }), '122004032124': dict({ 'last_report_date': 1694553457, 'last_report_watts': 199, 'max_report_watts': 297, 'serial_number': '122004032124', }), '122004039060': dict({ 'last_report_date': 1694553698, 'last_report_watts': 231, 'max_report_watts': 296, 'serial_number': '122004039060', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'battery_mode': 'self-consumption', 'charge_from_grid': False, 'date': '2023-08-31 06:04:08 UTC', 'operation_mode_sub_type': '', 'override': False, 'override_backup_soc': 30.0, 'override_chg_dischg_rate': 0.0, 'override_tou_mode': 'StorageTouMode_DEFAULT_TOU_MODE', 'reserved_soc': 20.0, 'schedule': dict({ 'Disable': list([ dict({ 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), ]), 'tariff': list([ dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'end': '10/1', 'start': '6/1', }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'end': '6/1', 'start': '10/1', }), ]), }), 'source': 'Tariff', 'version': '00.00.02', 'very_low_soc': 10, }), 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': '1693461802', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri', 'enable_discharge_to_grid': False, 'id': 'weekdays', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'filler', 'rate': 0.183109, 'start': 0, }), dict({ 'id': 'period_1', 'rate': 0.24488, 'start': 1020, }), dict({ 'id': 'filler', 'rate': 0.183109, 'start': 1200, }), ]), }), dict({ 'days': 'Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'weekend', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.183109, 'start': 0, }), dict({ 'id': 'filler', 'rate': 0.0, 'start': 1439, }), ]), }), ]), 'id': 'summer', 'start': '6/1', 'tiers': list([ ]), }), dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri', 'enable_discharge_to_grid': False, 'id': 'weekdays', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'filler', 'rate': 0.185529, 'start': 0, }), dict({ 'id': 'period_1', 'rate': 0.196829, 'start': 1020, }), dict({ 'id': 'filler', 'rate': 0.185529, 'start': 1200, }), ]), }), dict({ 'days': 'Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'weekend', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.185529, 'start': 0, }), dict({ 'id': 'filler', 'rate': 0.0, 'start': 1439, }), ]), }), ]), 'id': 'winter', 'start': '10/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri', 'id': 'weekdays', 'periods': list([ dict({ 'id': 'filler', 'rate': 0.183109, 'start': 0, }), dict({ 'id': 'period_1', 'rate': 0.24488, 'start': 1020, }), dict({ 'id': 'filler', 'rate': 0.183109, 'start': 1200, }), ]), }), dict({ 'days': 'Sat,Sun', 'id': 'weekend', 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.183109, 'start': 0, }), dict({ 'id': 'filler', 'rate': 0.0, 'start': 1439, }), ]), }), ]), 'id': 'summer', 'start': '6/1', }), dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri', 'id': 'weekdays', 'periods': list([ dict({ 'id': 'filler', 'rate': 0.185529, 'start': 0, }), dict({ 'id': 'period_1', 'rate': 0.196829, 'start': 1020, }), dict({ 'id': 'filler', 'rate': 0.185529, 'start': 1200, }), ]), }), dict({ 'days': 'Sat,Sun', 'id': 'weekend', 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.185529, 'start': 0, }), dict({ 'id': 'filler', 'rate': 0.0, 'start': 1439, }), ]), }), ]), 'id': 'winter', 'start': '10/1', }), ]), 'single_rate': dict({ 'rate': 0.183109, 'sell': 0.183109, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1693461802', 'mode': 'self-consumption', 'operation_mode_sub_type': '', 'reserved_soc': 20.0, 'very_low_soc': 10, }), }), }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1694553546, 'lastReportWatts': 232, 'maxReportWatts': 296, 'serialNumber': '122004028996', }), dict({ 'devType': 1, 'lastReportDate': 1694553576, 'lastReportWatts': 230, 'maxReportWatts': 296, 'serialNumber': '122004027913', }), dict({ 'devType': 1, 'lastReportDate': 1694553697, 'lastReportWatts': 129, 'maxReportWatts': 295, 'serialNumber': '122004028206', }), dict({ 'devType': 1, 'lastReportDate': 1694553698, 'lastReportWatts': 231, 'maxReportWatts': 296, 'serialNumber': '122004039060', }), dict({ 'devType': 1, 'lastReportDate': 1694553606, 'lastReportWatts': 263, 'maxReportWatts': 296, 'serialNumber': '122004028288', }), dict({ 'devType': 1, 'lastReportDate': 1694553699, 'lastReportWatts': 268, 'maxReportWatts': 297, 'serialNumber': '122004028991', }), dict({ 'devType': 1, 'lastReportDate': 1694553702, 'lastReportWatts': 229, 'maxReportWatts': 296, 'serialNumber': '122004028286', }), dict({ 'devType': 1, 'lastReportDate': 1694553426, 'lastReportWatts': 13, 'maxReportWatts': 296, 'serialNumber': '122004028091', }), dict({ 'devType': 1, 'lastReportDate': 1694553549, 'lastReportWatts': 170, 'maxReportWatts': 244, 'serialNumber': '122004032100', }), dict({ 'devType': 1, 'lastReportDate': 1694553427, 'lastReportWatts': 177, 'maxReportWatts': 286, 'serialNumber': '122004028400', }), dict({ 'devType': 1, 'lastReportDate': 1694553456, 'lastReportWatts': 266, 'maxReportWatts': 296, 'serialNumber': '122004028989', }), dict({ 'devType': 1, 'lastReportDate': 1694553607, 'lastReportWatts': 268, 'maxReportWatts': 296, 'serialNumber': '122004031655', }), dict({ 'devType': 1, 'lastReportDate': 1694553457, 'lastReportWatts': 199, 'maxReportWatts': 297, 'serialNumber': '122004032124', }), ]), '/ivp/ensemble/dry_contacts': dict({ 'dry_contacts': list([ dict({ 'id': 'NC1', 'status': 'open', }), dict({ 'id': 'NC2', 'status': 'open', }), dict({ 'id': 'NO1', 'status': 'open', }), dict({ 'id': 'NO2', 'status': 'open', }), ]), }), '/ivp/ensemble/inventory': list([ dict({ 'devices': list([ dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '2.1.27', 'comm_level_2_4_ghz': 3, 'comm_level_sub_ghz': 3, 'communicating': True, 'created_date': 1693554929, 'dc_switch_off': False, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 3360, 'encharge_rev': 1, 'img_load_date': 1693554929, 'img_pnum_running': '2.0.5663_rel/22.13', 'installed': 1693554929, 'last_rpt_date': 1694553651, 'led_status': 12, 'maxCellTemp': 25, 'operating': True, 'part_num': '830-00703-r64', 'percentFull': 96, 'serial_num': '122031000212', 'sleep_enabled': False, 'temperature': 25, 'zigbee_dongle_fw_version': '100B', }), dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '2.1.27', 'comm_level_2_4_ghz': 3, 'comm_level_sub_ghz': 3, 'communicating': True, 'created_date': 1693576648, 'dc_switch_off': False, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 3360, 'encharge_rev': 1, 'img_load_date': 1693576648, 'img_pnum_running': '2.0.5663_rel/22.13', 'installed': 1693576648, 'last_rpt_date': 1694553547, 'led_status': 12, 'maxCellTemp': 26, 'operating': True, 'part_num': '830-00703-r64', 'percentFull': 97, 'serial_num': '122031000215', 'sleep_enabled': False, 'temperature': 25, 'zigbee_dongle_fw_version': '100B', }), dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '2.1.27', 'comm_level_2_4_ghz': 4, 'comm_level_sub_ghz': 4, 'communicating': True, 'created_date': 1694098472, 'dc_switch_off': False, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 3360, 'encharge_rev': 1, 'img_load_date': 1694098472, 'img_pnum_running': '2.0.5663_rel/22.13', 'installed': 1694098472, 'last_rpt_date': 1694553574, 'led_status': 12, 'maxCellTemp': 26, 'operating': True, 'part_num': '830-00703-r64', 'percentFull': 96, 'serial_num': '122031023943', 'sleep_enabled': False, 'temperature': 25, 'zigbee_dongle_fw_version': '100B', }), ]), 'type': 'ENCHARGE', }), dict({ 'devices': list([ dict({ 'Enchg_grid_mode': 'multimode-ongrid', 'Enpwr_curr_state_id': 16, 'Enpwr_grid_mode': 'multimode-ongrid', 'Enpwr_relay_state_bm': 304, 'admin_state': 24, 'admin_state_str': 'ENPWR_STATE_OPER_CLOSED', 'comm_level_2_4_ghz': 2, 'comm_level_sub_ghz': 2, 'communicating': True, 'created_date': 1688303357, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'img_load_date': 1688303357, 'img_pnum_running': '1.5.5229_rel/22.13', 'installed': 1688303357, 'last_rpt_date': 1694553566, 'mains_admin_state': 'closed', 'mains_oper_state': 'closed', 'operating': True, 'part_num': '860-00276-r33', 'serial_num': '122036058363', 'temperature': 78, 'zigbee_dongle_fw_version': '100B', }), ]), 'type': 'ENPOWER', }), ]), '/ivp/ensemble/power': dict({ 'devices:': list([ dict({ 'apparent_power_mva': -676000, 'real_power_mw': -676000, 'serial_num': '122031000212', 'soc': 96, }), dict({ 'apparent_power_mva': -680000, 'real_power_mw': -680000, 'serial_num': '122031000215', 'soc': 97, }), dict({ 'apparent_power_mva': -676000, 'real_power_mw': -676000, 'serial_num': '122031023943', 'soc': 96, }), ]), }), '/ivp/ensemble/secctrl': dict({ 'ACB_agg_energy': 0, 'ACB_agg_soc': 0, 'ENC_agg_avail_energy': 9710, 'ENC_agg_backup_energy': 2016, 'ENC_agg_soc': 96, 'Enc_commissioned_capacity': 10080, 'Enc_max_available_capacity': 10080, 'Max_energy': 10080, 'adjusted_backup_soc': 20, 'agg_soc': 96, 'configured_backup_soc': 20, 'freq_bias_hz': -0.6863999962806702, 'freq_bias_hz_phaseb': 0.0, 'freq_bias_hz_phasec': 0.0, 'freq_bias_hz_q8': -1104, 'freq_bias_hz_q8_phaseb': 0, 'freq_bias_hz_q8_phasec': 0, 'shutdown': False, 'voltage_bias_v': -8.319999694824219, 'voltage_bias_v_phaseb': 0.0, 'voltage_bias_v_phasec': 0.0, 'voltage_bias_v_q5': -266, 'voltage_bias_v_q5_phaseb': 0, 'voltage_bias_v_q5_phasec': 0, }), '/ivp/meters': list([ dict({ 'eid': 704643328, 'measurementType': 'production', 'meteringStatus': 'normal', 'phaseCount': 2, 'phaseMode': 'split', 'state': 'enabled', 'statusFlags': list([ ]), }), dict({ 'eid': 704643584, 'measurementType': 'net-consumption', 'meteringStatus': 'normal', 'phaseCount': 2, 'phaseMode': 'split', 'state': 'enabled', 'statusFlags': list([ ]), }), ]), '/ivp/meters/readings': list([ dict({ 'actEnergyDlvd': 18442496.933, 'actEnergyRcvd': 0.069, 'activePower': 2659.845, 'apparentEnergy': 21988447.961, 'apparentPower': 2661.49, 'channels': list([ dict({ 'actEnergyDlvd': 9224604.961, 'actEnergyRcvd': 0.018, 'activePower': 1330.866, 'apparentEnergy': 10992997.506, 'apparentPower': 1331.981, 'current': 10.865, 'eid': 1778385169, 'freq': 60.0, 'instantaneousDemand': 1330.866, 'pwrFactor': 1.0, 'reactEnergyLagg': 1823613.307, 'reactEnergyLead': 113311.01, 'reactivePower': 8.891, 'timestamp': 1694553765, 'voltage': 122.565, }), dict({ 'actEnergyDlvd': 9217891.972, 'actEnergyRcvd': 0.051, 'activePower': 1328.979, 'apparentEnergy': 10995450.455, 'apparentPower': 1329.509, 'current': 10.871, 'eid': 1778385170, 'freq': 60.0, 'instantaneousDemand': 1328.979, 'pwrFactor': 1.0, 'reactEnergyLagg': 1817923.688, 'reactEnergyLead': 122718.31, 'reactivePower': 7.776, 'timestamp': 1694553765, 'voltage': 122.28, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 0.0, 'activePower': 0.0, 'apparentEnergy': 0.0, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385171, 'freq': 60.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 0.0, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1694553765, 'voltage': 0.0, }), ]), 'current': 21.736, 'eid': 704643328, 'freq': 60.0, 'instantaneousDemand': 2659.845, 'pwrFactor': 1.0, 'reactEnergyLagg': 3641536.995, 'reactEnergyLead': 236029.32, 'reactivePower': 16.667, 'timestamp': 1694553765, 'voltage': 244.845, }), dict({ 'actEnergyDlvd': 4873881.221, 'actEnergyRcvd': 7554062.483, 'activePower': 23.172, 'apparentEnergy': 18779628.396, 'apparentPower': 364.999, 'channels': list([ dict({ 'actEnergyDlvd': 3374056.076, 'actEnergyRcvd': 3340639.336, 'activePower': -17.438, 'apparentEnergy': 9863909.676, 'apparentPower': 143.478, 'current': 1.18, 'eid': 1778385425, 'freq': 60.0, 'instantaneousDemand': -17.438, 'pwrFactor': -0.154, 'reactEnergyLagg': 50177.337, 'reactEnergyLead': 4264141.719, 'reactivePower': -95.235, 'timestamp': 1694553765, 'voltage': 122.634, }), dict({ 'actEnergyDlvd': 1499825.145, 'actEnergyRcvd': 4213423.147, 'activePower': 40.61, 'apparentEnergy': 8915718.719, 'apparentPower': 221.521, 'current': 1.806, 'eid': 1778385426, 'freq': 60.0, 'instantaneousDemand': 40.61, 'pwrFactor': 0.15, 'reactEnergyLagg': 449728.699, 'reactEnergyLead': 3365454.56, 'reactivePower': -144.988, 'timestamp': 1694553765, 'voltage': 122.375, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 0.0, 'activePower': 0.0, 'apparentEnergy': 0.0, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385427, 'freq': 60.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 0.0, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1694553765, 'voltage': 0.0, }), ]), 'current': 2.985, 'eid': 704643584, 'freq': 60.0, 'instantaneousDemand': 23.172, 'pwrFactor': 0.031, 'reactEnergyLagg': 499906.036, 'reactEnergyLead': 7629596.279, 'reactivePower': -240.223, 'timestamp': 1694553765, 'voltage': 245.008, }), ]), '/ivp/ss/dry_contact_settings': dict({ 'dry_contacts': list([ dict({ 'gen_action': 'none', 'grid_action': 'none', 'id': 'NC1', 'load_name': '', 'micro_grid_action': 'none', 'mode': 'manual', 'override': 'false', 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'NONE', }), dict({ 'gen_action': 'none', 'grid_action': 'none', 'id': 'NC2', 'load_name': '', 'micro_grid_action': 'none', 'mode': 'manual', 'override': 'false', 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'NONE', }), dict({ 'gen_action': 'none', 'grid_action': 'none', 'id': 'NO1', 'load_name': '', 'micro_grid_action': 'none', 'mode': 'manual', 'override': 'false', 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'NONE', }), dict({ 'gen_action': 'none', 'grid_action': 'none', 'id': 'NO2', 'load_name': '', 'micro_grid_action': 'none', 'mode': 'manual', 'override': 'false', 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'NONE', }), ]), }), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 1, 'apprntPwr': 2748.29, 'measurementType': 'total-consumption', 'pwrFactor': 0.99, 'reactPwr': -221.854, 'readingTime': 1694553763, 'rmsCurrent': 22.422, 'rmsVoltage': 245.187, 'type': 'eim', 'vahLifetime': 18779628.073, 'vahToday': 7275.073, 'varhLagLifetime': -3141630.945, 'varhLagToday': 0.0, 'varhLeadLifetime': 7393566.746, 'varhLeadToday': 5177.746, 'wNow': 2712.776, 'whLastSevenDays': 348.638, 'whLifetime': 15745050.638, 'whToday': 12901.638, }), dict({ 'activeCount': 1, 'apprntPwr': 83.613, 'measurementType': 'net-consumption', 'pwrFactor': 0.56, 'reactPwr': -240.621, 'readingTime': 1694553763, 'rmsCurrent': 0.686, 'rmsVoltage': 245.187, 'type': 'eim', 'vahLifetime': 18779628.073, 'vahToday': 0, 'varhLagLifetime': 499906.036, 'varhLagToday': 0, 'varhLeadLifetime': 7629596.066, 'varhLeadToday': 0, 'wNow': 49.701, 'whLastSevenDays': 0, 'whLifetime': -2662918.637, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 13, 'readingTime': 1694553761, 'type': 'inverters', 'wNow': 2675, 'whLifetime': 640883, }), dict({ 'activeCount': 1, 'apprntPwr': 2664.473, 'measurementType': 'production', 'pwrFactor': 1.0, 'reactPwr': 18.766, 'readingTime': 1694553763, 'rmsCurrent': 21.736, 'rmsVoltage': 245.138, 'type': 'eim', 'vahLifetime': 21988445.596, 'vahToday': 13609.596, 'varhLagLifetime': 3641536.981, 'varhLagToday': 2248.981, 'varhLeadLifetime': 236029.32, 'varhLeadToday': 0.32, 'wNow': 2663.075, 'whLastSevenDays': 18431345.567, 'whLifetime': 18442494.567, 'whToday': 11494.567, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': dict({ 'watt_hours_last_7_days': 349, 'watt_hours_lifetime': 15745051, 'watt_hours_today': 12902, 'watts_now': 2713, }), 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 18431346, 'watt_hours_lifetime': 18442495, 'watt_hours_today': 11495, 'watts_now': 2663, }), 'system_production_phases': None, 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': '1693461802', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri', 'enable_discharge_to_grid': False, 'id': 'weekdays', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'filler', 'rate': 0.183109, 'start': 0, }), dict({ 'id': 'period_1', 'rate': 0.24488, 'start': 1020, }), dict({ 'id': 'filler', 'rate': 0.183109, 'start': 1200, }), ]), }), dict({ 'days': 'Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'weekend', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.183109, 'start': 0, }), dict({ 'id': 'filler', 'rate': 0.0, 'start': 1439, }), ]), }), ]), 'id': 'summer', 'start': '6/1', 'tiers': list([ ]), }), dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri', 'enable_discharge_to_grid': False, 'id': 'weekdays', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'filler', 'rate': 0.185529, 'start': 0, }), dict({ 'id': 'period_1', 'rate': 0.196829, 'start': 1020, }), dict({ 'id': 'filler', 'rate': 0.185529, 'start': 1200, }), ]), }), dict({ 'days': 'Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'weekend', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.185529, 'start': 0, }), dict({ 'id': 'filler', 'rate': 0.0, 'start': 1439, }), ]), }), ]), 'id': 'winter', 'start': '10/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri', 'id': 'weekdays', 'periods': list([ dict({ 'id': 'filler', 'rate': 0.183109, 'start': 0, }), dict({ 'id': 'period_1', 'rate': 0.24488, 'start': 1020, }), dict({ 'id': 'filler', 'rate': 0.183109, 'start': 1200, }), ]), }), dict({ 'days': 'Sat,Sun', 'id': 'weekend', 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.183109, 'start': 0, }), dict({ 'id': 'filler', 'rate': 0.0, 'start': 1439, }), ]), }), ]), 'id': 'summer', 'start': '6/1', }), dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri', 'id': 'weekdays', 'periods': list([ dict({ 'id': 'filler', 'rate': 0.185529, 'start': 0, }), dict({ 'id': 'period_1', 'rate': 0.196829, 'start': 1020, }), dict({ 'id': 'filler', 'rate': 0.185529, 'start': 1200, }), ]), }), dict({ 'days': 'Sat,Sun', 'id': 'weekend', 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.185529, 'start': 0, }), dict({ 'id': 'filler', 'rate': 0.0, 'start': 1439, }), ]), }), ]), 'id': 'winter', 'start': '10/1', }), ]), 'single_rate': dict({ 'rate': 0.183109, 'sell': 0.183109, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1693461802', 'mode': , 'operation_mode_sub_type': '', 'reserved_soc': 20.0, 'very_low_soc': 10, }), }), }) # --- # name: test_with_7_x_firmware[7.6.114_without_cts] dict({ 'ctmeter_consumption': None, 'ctmeter_consumption_phases': None, 'ctmeter_production': None, 'ctmeter_production_phases': None, 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ }), 'dry_contact_status': dict({ }), 'encharge_aggregate': None, 'encharge_inventory': None, 'encharge_power': None, 'enpower': None, 'inverters': dict({ '482305021663': dict({ 'last_report_date': 1691412935, 'last_report_watts': 48, 'max_report_watts': 329, 'serial_number': '482305021663', }), '482305022836': dict({ 'last_report_date': 1691412935, 'last_report_watts': 39, 'max_report_watts': 330, 'serial_number': '482305022836', }), '482305023640': dict({ 'last_report_date': 1691412965, 'last_report_watts': 50, 'max_report_watts': 330, 'serial_number': '482305023640', }), '482306060958': dict({ 'last_report_date': 1691412754, 'last_report_watts': 47, 'max_report_watts': 330, 'serial_number': '482306060958', }), '482306074560': dict({ 'last_report_date': 1691412755, 'last_report_watts': 48, 'max_report_watts': 330, 'serial_number': '482306074560', }), '482306075432': dict({ 'last_report_date': 1691412757, 'last_report_watts': 46, 'max_report_watts': 330, 'serial_number': '482306075432', }), '482306075729': dict({ 'last_report_date': 1691412758, 'last_report_watts': 48, 'max_report_watts': 330, 'serial_number': '482306075729', }), '482306076034': dict({ 'last_report_date': 1691412759, 'last_report_watts': 48, 'max_report_watts': 330, 'serial_number': '482306076034', }), '482306083701': dict({ 'last_report_date': 1691412936, 'last_report_watts': 48, 'max_report_watts': 330, 'serial_number': '482306083701', }), '482306083705': dict({ 'last_report_date': 1691412937, 'last_report_watts': 33, 'max_report_watts': 329, 'serial_number': '482306083705', }), '482306083763': dict({ 'last_report_date': 1691412760, 'last_report_watts': 47, 'max_report_watts': 330, 'serial_number': '482306083763', }), '482306083851': dict({ 'last_report_date': 1691412938, 'last_report_watts': 44, 'max_report_watts': 330, 'serial_number': '482306083851', }), '482306101590': dict({ 'last_report_date': 1691412939, 'last_report_watts': 40, 'max_report_watts': 330, 'serial_number': '482306101590', }), }), 'raw': dict({ '/api/v1/production': dict({ 'wattHoursLifetime': 1544282, 'wattHoursSevenDays': 101742, 'wattHoursToday': 10363, 'wattsNow': 586, }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1691412935, 'lastReportWatts': 48, 'maxReportWatts': 329, 'serialNumber': '482305021663', }), dict({ 'devType': 1, 'lastReportDate': 1691412935, 'lastReportWatts': 39, 'maxReportWatts': 330, 'serialNumber': '482305022836', }), dict({ 'devType': 1, 'lastReportDate': 1691412965, 'lastReportWatts': 50, 'maxReportWatts': 330, 'serialNumber': '482305023640', }), dict({ 'devType': 1, 'lastReportDate': 1691412754, 'lastReportWatts': 47, 'maxReportWatts': 330, 'serialNumber': '482306060958', }), dict({ 'devType': 1, 'lastReportDate': 1691412755, 'lastReportWatts': 48, 'maxReportWatts': 330, 'serialNumber': '482306074560', }), dict({ 'devType': 1, 'lastReportDate': 1691412757, 'lastReportWatts': 46, 'maxReportWatts': 330, 'serialNumber': '482306075432', }), dict({ 'devType': 1, 'lastReportDate': 1691412758, 'lastReportWatts': 48, 'maxReportWatts': 330, 'serialNumber': '482306075729', }), dict({ 'devType': 1, 'lastReportDate': 1691412759, 'lastReportWatts': 48, 'maxReportWatts': 330, 'serialNumber': '482306076034', }), dict({ 'devType': 1, 'lastReportDate': 1691412936, 'lastReportWatts': 48, 'maxReportWatts': 330, 'serialNumber': '482306083701', }), dict({ 'devType': 1, 'lastReportDate': 1691412937, 'lastReportWatts': 33, 'maxReportWatts': 329, 'serialNumber': '482306083705', }), dict({ 'devType': 1, 'lastReportDate': 1691412760, 'lastReportWatts': 47, 'maxReportWatts': 330, 'serialNumber': '482306083763', }), dict({ 'devType': 1, 'lastReportDate': 1691412938, 'lastReportWatts': 44, 'maxReportWatts': 330, 'serialNumber': '482306083851', }), dict({ 'devType': 1, 'lastReportDate': 1691412939, 'lastReportWatts': 40, 'maxReportWatts': 330, 'serialNumber': '482306101590', }), ]), }), 'system_consumption': None, 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 101742, 'watt_hours_lifetime': 1544282, 'watt_hours_today': 10363, 'watts_now': 586, }), 'system_production_phases': None, 'tariff': None, }) # --- # name: test_with_7_x_firmware[7.6.175] dict({ 'ctmeter_consumption': None, 'ctmeter_consumption_phases': None, 'ctmeter_production': None, 'ctmeter_production_phases': None, 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ }), 'dry_contact_status': dict({ }), 'encharge_aggregate': None, 'encharge_inventory': None, 'encharge_power': None, 'enpower': None, 'inverters': dict({ '122146075749': dict({ 'last_report_date': 1691318584, 'last_report_watts': 270, 'max_report_watts': 296, 'serial_number': '122146075749', }), '122146076029': dict({ 'last_report_date': 1691318494, 'last_report_watts': 281, 'max_report_watts': 297, 'serial_number': '122146076029', }), '122146076125': dict({ 'last_report_date': 1691318704, 'last_report_watts': 229, 'max_report_watts': 297, 'serial_number': '122146076125', }), '122146076128': dict({ 'last_report_date': 1691318674, 'last_report_watts': 245, 'max_report_watts': 297, 'serial_number': '122146076128', }), '122146076272': dict({ 'last_report_date': 1691318672, 'last_report_watts': 243, 'max_report_watts': 297, 'serial_number': '122146076272', }), '122146076336': dict({ 'last_report_date': 1691318523, 'last_report_watts': 275, 'max_report_watts': 296, 'serial_number': '122146076336', }), '122146076488': dict({ 'last_report_date': 1691318612, 'last_report_watts': 260, 'max_report_watts': 297, 'serial_number': '122146076488', }), '122146076492': dict({ 'last_report_date': 1691318556, 'last_report_watts': 273, 'max_report_watts': 297, 'serial_number': '122146076492', }), '122146076500': dict({ 'last_report_date': 1691318613, 'last_report_watts': 259, 'max_report_watts': 297, 'serial_number': '122146076500', }), '122146076518': dict({ 'last_report_date': 1691318462, 'last_report_watts': 290, 'max_report_watts': 297, 'serial_number': '122146076518', }), '122146076618': dict({ 'last_report_date': 1691318643, 'last_report_watts': 250, 'max_report_watts': 297, 'serial_number': '122146076618', }), '122146078718': dict({ 'last_report_date': 1691318583, 'last_report_watts': 273, 'max_report_watts': 297, 'serial_number': '122146078718', }), '122146078769': dict({ 'last_report_date': 1691318673, 'last_report_watts': 243, 'max_report_watts': 297, 'serial_number': '122146078769', }), }), 'raw': dict({ '/api/v1/production': dict({ 'wattHoursLifetime': 8717473, 'wattHoursSevenDays': 107011, 'wattHoursToday': 7883, 'wattsNow': 3391, }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1691318583, 'lastReportWatts': 273, 'maxReportWatts': 297, 'serialNumber': '122146078718', }), dict({ 'devType': 1, 'lastReportDate': 1691318584, 'lastReportWatts': 270, 'maxReportWatts': 296, 'serialNumber': '122146075749', }), dict({ 'devType': 1, 'lastReportDate': 1691318612, 'lastReportWatts': 260, 'maxReportWatts': 297, 'serialNumber': '122146076488', }), dict({ 'devType': 1, 'lastReportDate': 1691318643, 'lastReportWatts': 250, 'maxReportWatts': 297, 'serialNumber': '122146076618', }), dict({ 'devType': 1, 'lastReportDate': 1691318462, 'lastReportWatts': 290, 'maxReportWatts': 297, 'serialNumber': '122146076518', }), dict({ 'devType': 1, 'lastReportDate': 1691318523, 'lastReportWatts': 275, 'maxReportWatts': 296, 'serialNumber': '122146076336', }), dict({ 'devType': 1, 'lastReportDate': 1691318704, 'lastReportWatts': 229, 'maxReportWatts': 297, 'serialNumber': '122146076125', }), dict({ 'devType': 1, 'lastReportDate': 1691318672, 'lastReportWatts': 243, 'maxReportWatts': 297, 'serialNumber': '122146076272', }), dict({ 'devType': 1, 'lastReportDate': 1691318556, 'lastReportWatts': 273, 'maxReportWatts': 297, 'serialNumber': '122146076492', }), dict({ 'devType': 1, 'lastReportDate': 1691318613, 'lastReportWatts': 259, 'maxReportWatts': 297, 'serialNumber': '122146076500', }), dict({ 'devType': 1, 'lastReportDate': 1691318494, 'lastReportWatts': 281, 'maxReportWatts': 297, 'serialNumber': '122146076029', }), dict({ 'devType': 1, 'lastReportDate': 1691318673, 'lastReportWatts': 243, 'maxReportWatts': 297, 'serialNumber': '122146078769', }), dict({ 'devType': 1, 'lastReportDate': 1691318674, 'lastReportWatts': 245, 'maxReportWatts': 297, 'serialNumber': '122146076128', }), ]), }), 'system_consumption': None, 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 107011, 'watt_hours_lifetime': 8717473, 'watt_hours_today': 7883, 'watts_now': 3391, }), 'system_production_phases': None, 'tariff': None, }) # --- # name: test_with_7_x_firmware[7.6.175_standard] dict({ 'ctmeter_consumption': None, 'ctmeter_consumption_phases': None, 'ctmeter_production': None, 'ctmeter_production_phases': None, 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ }), 'dry_contact_status': dict({ }), 'encharge_aggregate': None, 'encharge_inventory': None, 'encharge_power': None, 'enpower': None, 'inverters': dict({ '122218040027': dict({ 'last_report_date': 1691416390, 'last_report_watts': 299, 'max_report_watts': 345, 'serial_number': '122218040027', }), '122218042847': dict({ 'last_report_date': 1691416211, 'last_report_watts': 272, 'max_report_watts': 341, 'serial_number': '122218042847', }), '122218043128': dict({ 'last_report_date': 1691416301, 'last_report_watts': 292, 'max_report_watts': 354, 'serial_number': '122218043128', }), '122218044477': dict({ 'last_report_date': 1691416513, 'last_report_watts': 205, 'max_report_watts': 346, 'serial_number': '122218044477', }), '122218051640': dict({ 'last_report_date': 1691416484, 'last_report_watts': 231, 'max_report_watts': 345, 'serial_number': '122218051640', }), '122218052484': dict({ 'last_report_date': 1691416275, 'last_report_watts': 284, 'max_report_watts': 348, 'serial_number': '122218052484', }), '122218054157': dict({ 'last_report_date': 1691416304, 'last_report_watts': 286, 'max_report_watts': 349, 'serial_number': '122218054157', }), '122219082033': dict({ 'last_report_date': 1691416299, 'last_report_watts': 211, 'max_report_watts': 324, 'serial_number': '122219082033', }), '122219083015': dict({ 'last_report_date': 1691416509, 'last_report_watts': 158, 'max_report_watts': 312, 'serial_number': '122219083015', }), '122219083049': dict({ 'last_report_date': 1691416242, 'last_report_watts': 214, 'max_report_watts': 315, 'serial_number': '122219083049', }), '122219083053': dict({ 'last_report_date': 1691416331, 'last_report_watts': 226, 'max_report_watts': 315, 'serial_number': '122219083053', }), '122219083804': dict({ 'last_report_date': 1691416420, 'last_report_watts': 268, 'max_report_watts': 338, 'serial_number': '122219083804', }), '122219084138': dict({ 'last_report_date': 1691416304, 'last_report_watts': 211, 'max_report_watts': 307, 'serial_number': '122219084138', }), '122219084557': dict({ 'last_report_date': 1691416330, 'last_report_watts': 219, 'max_report_watts': 312, 'serial_number': '122219084557', }), '122219084578': dict({ 'last_report_date': 1691416303, 'last_report_watts': 275, 'max_report_watts': 338, 'serial_number': '122219084578', }), '122219084937': dict({ 'last_report_date': 1691416359, 'last_report_watts': 244, 'max_report_watts': 312, 'serial_number': '122219084937', }), '122219085086': dict({ 'last_report_date': 1691416453, 'last_report_watts': 248, 'max_report_watts': 339, 'serial_number': '122219085086', }), '122219085199': dict({ 'last_report_date': 1691416421, 'last_report_watts': 213, 'max_report_watts': 326, 'serial_number': '122219085199', }), '122219085275': dict({ 'last_report_date': 1691416241, 'last_report_watts': 209, 'max_report_watts': 314, 'serial_number': '122219085275', }), '122219085710': dict({ 'last_report_date': 1691416210, 'last_report_watts': 207, 'max_report_watts': 327, 'serial_number': '122219085710', }), '122219086026': dict({ 'last_report_date': 1691416301, 'last_report_watts': 222, 'max_report_watts': 319, 'serial_number': '122219086026', }), '122220004338': dict({ 'last_report_date': 1691416271, 'last_report_watts': 212, 'max_report_watts': 323, 'serial_number': '122220004338', }), '122220004813': dict({ 'last_report_date': 1691416212, 'last_report_watts': 267, 'max_report_watts': 336, 'serial_number': '122220004813', }), '122220009431': dict({ 'last_report_date': 1691416210, 'last_report_watts': 267, 'max_report_watts': 340, 'serial_number': '122220009431', }), }), 'raw': dict({ '/api/v1/production': dict({ 'wattHoursLifetime': 6139406, 'wattHoursSevenDays': 189712, 'wattHoursToday': 36462, 'wattsNow': 5740, }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1691416241, 'lastReportWatts': 209, 'maxReportWatts': 314, 'serialNumber': '122219085275', }), dict({ 'devType': 1, 'lastReportDate': 1691416453, 'lastReportWatts': 248, 'maxReportWatts': 339, 'serialNumber': '122219085086', }), dict({ 'devType': 1, 'lastReportDate': 1691416509, 'lastReportWatts': 158, 'maxReportWatts': 312, 'serialNumber': '122219083015', }), dict({ 'devType': 1, 'lastReportDate': 1691416299, 'lastReportWatts': 211, 'maxReportWatts': 324, 'serialNumber': '122219082033', }), dict({ 'devType': 1, 'lastReportDate': 1691416271, 'lastReportWatts': 212, 'maxReportWatts': 323, 'serialNumber': '122220004338', }), dict({ 'devType': 1, 'lastReportDate': 1691416330, 'lastReportWatts': 219, 'maxReportWatts': 312, 'serialNumber': '122219084557', }), dict({ 'devType': 1, 'lastReportDate': 1691416210, 'lastReportWatts': 267, 'maxReportWatts': 340, 'serialNumber': '122220009431', }), dict({ 'devType': 1, 'lastReportDate': 1691416210, 'lastReportWatts': 207, 'maxReportWatts': 327, 'serialNumber': '122219085710', }), dict({ 'devType': 1, 'lastReportDate': 1691416390, 'lastReportWatts': 299, 'maxReportWatts': 345, 'serialNumber': '122218040027', }), dict({ 'devType': 1, 'lastReportDate': 1691416242, 'lastReportWatts': 214, 'maxReportWatts': 315, 'serialNumber': '122219083049', }), dict({ 'devType': 1, 'lastReportDate': 1691416420, 'lastReportWatts': 268, 'maxReportWatts': 338, 'serialNumber': '122219083804', }), dict({ 'devType': 1, 'lastReportDate': 1691416301, 'lastReportWatts': 222, 'maxReportWatts': 319, 'serialNumber': '122219086026', }), dict({ 'devType': 1, 'lastReportDate': 1691416359, 'lastReportWatts': 244, 'maxReportWatts': 312, 'serialNumber': '122219084937', }), dict({ 'devType': 1, 'lastReportDate': 1691416301, 'lastReportWatts': 292, 'maxReportWatts': 354, 'serialNumber': '122218043128', }), dict({ 'devType': 1, 'lastReportDate': 1691416275, 'lastReportWatts': 284, 'maxReportWatts': 348, 'serialNumber': '122218052484', }), dict({ 'devType': 1, 'lastReportDate': 1691416421, 'lastReportWatts': 213, 'maxReportWatts': 326, 'serialNumber': '122219085199', }), dict({ 'devType': 1, 'lastReportDate': 1691416484, 'lastReportWatts': 231, 'maxReportWatts': 345, 'serialNumber': '122218051640', }), dict({ 'devType': 1, 'lastReportDate': 1691416303, 'lastReportWatts': 275, 'maxReportWatts': 338, 'serialNumber': '122219084578', }), dict({ 'devType': 1, 'lastReportDate': 1691416331, 'lastReportWatts': 226, 'maxReportWatts': 315, 'serialNumber': '122219083053', }), dict({ 'devType': 1, 'lastReportDate': 1691416304, 'lastReportWatts': 211, 'maxReportWatts': 307, 'serialNumber': '122219084138', }), dict({ 'devType': 1, 'lastReportDate': 1691416304, 'lastReportWatts': 286, 'maxReportWatts': 349, 'serialNumber': '122218054157', }), dict({ 'devType': 1, 'lastReportDate': 1691416211, 'lastReportWatts': 272, 'maxReportWatts': 341, 'serialNumber': '122218042847', }), dict({ 'devType': 1, 'lastReportDate': 1691416212, 'lastReportWatts': 267, 'maxReportWatts': 336, 'serialNumber': '122220004813', }), dict({ 'devType': 1, 'lastReportDate': 1691416513, 'lastReportWatts': 205, 'maxReportWatts': 346, 'serialNumber': '122218044477', }), ]), }), 'system_consumption': None, 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 189712, 'watt_hours_lifetime': 6139406, 'watt_hours_today': 36462, 'watts_now': 5740, }), 'system_production_phases': None, 'tariff': None, }) # --- # name: test_with_7_x_firmware[7.6.175_total] dict({ 'ctmeter_consumption': None, 'ctmeter_consumption_phases': None, 'ctmeter_production': None, 'ctmeter_production_phases': None, 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ }), 'dry_contact_status': dict({ }), 'encharge_aggregate': None, 'encharge_inventory': None, 'encharge_power': None, 'enpower': None, 'inverters': dict({ '122107025358': dict({ 'last_report_date': 1694181961, 'last_report_watts': 190, 'max_report_watts': 279, 'serial_number': '122107025358', }), '122107031694': dict({ 'last_report_date': 1694182111, 'last_report_watts': 193, 'max_report_watts': 289, 'serial_number': '122107031694', }), '122107031731': dict({ 'last_report_date': 1694182200, 'last_report_watts': 22, 'max_report_watts': 296, 'serial_number': '122107031731', }), '122107032484': dict({ 'last_report_date': 1694182142, 'last_report_watts': 21, 'max_report_watts': 296, 'serial_number': '122107032484', }), '122107032623': dict({ 'last_report_date': 1694181960, 'last_report_watts': 190, 'max_report_watts': 279, 'serial_number': '122107032623', }), '122107032918': dict({ 'last_report_date': 1694181930, 'last_report_watts': 21, 'max_report_watts': 296, 'serial_number': '122107032918', }), '122107032940': dict({ 'last_report_date': 1694182172, 'last_report_watts': 21, 'max_report_watts': 296, 'serial_number': '122107032940', }), '122107033602': dict({ 'last_report_date': 1694181992, 'last_report_watts': 22, 'max_report_watts': 296, 'serial_number': '122107033602', }), '122107033629': dict({ 'last_report_date': 1694182081, 'last_report_watts': 194, 'max_report_watts': 289, 'serial_number': '122107033629', }), '122107033673': dict({ 'last_report_date': 1694182140, 'last_report_watts': 21, 'max_report_watts': 296, 'serial_number': '122107033673', }), '122107035544': dict({ 'last_report_date': 1694182140, 'last_report_watts': 191, 'max_report_watts': 283, 'serial_number': '122107035544', }), '122107035551': dict({ 'last_report_date': 1694182111, 'last_report_watts': 191, 'max_report_watts': 287, 'serial_number': '122107035551', }), '122107035554': dict({ 'last_report_date': 1694182170, 'last_report_watts': 21, 'max_report_watts': 296, 'serial_number': '122107035554', }), '122107035597': dict({ 'last_report_date': 1694182052, 'last_report_watts': 21, 'max_report_watts': 296, 'serial_number': '122107035597', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'battery_mode': 'self-consumption', 'charge_from_grid': False, 'date': '2023-07-06 06:11:26 UTC', 'operation_mode_sub_type': '', 'override': False, 'override_backup_soc': 30.0, 'override_chg_dischg_rate': 0.0, 'override_tou_mode': 'StorageTouMode_DEFAULT_TOU_MODE', 'reserved_soc': 30.0, 'schedule': dict({ 'Disable': list([ dict({ 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), ]), 'tariff': list([ dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'end': '1/1', 'start': '1/1', }), ]), }), 'source': 'Tariff', 'version': '00.00.02', 'very_low_soc': 10, }), 'tariff': dict({ 'currency': dict({ 'code': 'EUR', }), 'date': '1688623885', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'all_days', 'must_charge_duration': 0, 'must_charge_mode': 'CG', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'filler', 'rate': 0.38914, 'start': 0, }), dict({ 'id': 'period_1', 'rate': 0.4424, 'start': 420, }), dict({ 'id': 'filler', 'rate': 0.38914, 'start': 1381, }), ]), }), ]), 'id': 'all_year_long', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.38914, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1688623885', 'mode': 'self-consumption', 'operation_mode_sub_type': '', 'reserved_soc': 30.0, 'very_low_soc': 10, }), }), }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1694182111, 'lastReportWatts': 193, 'maxReportWatts': 289, 'serialNumber': '122107031694', }), dict({ 'devType': 1, 'lastReportDate': 1694182200, 'lastReportWatts': 22, 'maxReportWatts': 296, 'serialNumber': '122107031731', }), dict({ 'devType': 1, 'lastReportDate': 1694182140, 'lastReportWatts': 21, 'maxReportWatts': 296, 'serialNumber': '122107033673', }), dict({ 'devType': 1, 'lastReportDate': 1694182081, 'lastReportWatts': 194, 'maxReportWatts': 289, 'serialNumber': '122107033629', }), dict({ 'devType': 1, 'lastReportDate': 1694182170, 'lastReportWatts': 21, 'maxReportWatts': 296, 'serialNumber': '122107035554', }), dict({ 'devType': 1, 'lastReportDate': 1694181992, 'lastReportWatts': 22, 'maxReportWatts': 296, 'serialNumber': '122107033602', }), dict({ 'devType': 1, 'lastReportDate': 1694182052, 'lastReportWatts': 21, 'maxReportWatts': 296, 'serialNumber': '122107035597', }), dict({ 'devType': 1, 'lastReportDate': 1694181960, 'lastReportWatts': 190, 'maxReportWatts': 279, 'serialNumber': '122107032623', }), dict({ 'devType': 1, 'lastReportDate': 1694182140, 'lastReportWatts': 191, 'maxReportWatts': 283, 'serialNumber': '122107035544', }), dict({ 'devType': 1, 'lastReportDate': 1694182111, 'lastReportWatts': 191, 'maxReportWatts': 287, 'serialNumber': '122107035551', }), dict({ 'devType': 1, 'lastReportDate': 1694181930, 'lastReportWatts': 21, 'maxReportWatts': 296, 'serialNumber': '122107032918', }), dict({ 'devType': 1, 'lastReportDate': 1694182172, 'lastReportWatts': 21, 'maxReportWatts': 296, 'serialNumber': '122107032940', }), dict({ 'devType': 1, 'lastReportDate': 1694181961, 'lastReportWatts': 190, 'maxReportWatts': 279, 'serialNumber': '122107025358', }), dict({ 'devType': 1, 'lastReportDate': 1694182142, 'lastReportWatts': 21, 'maxReportWatts': 296, 'serialNumber': '122107032484', }), ]), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 0, 'apprntPwr': 0.412, 'measurementType': 'total-consumption', 'pwrFactor': -1.0, 'reactPwr': 0.0, 'readingTime': 1694182274, 'rmsCurrent': 0.27, 'rmsVoltage': 238.786, 'type': 'eim', 'vahLifetime': 0.0, 'vahToday': 0.0, 'varhLagLifetime': 0.0, 'varhLagToday': 0.0, 'varhLeadLifetime': 0.0, 'varhLeadToday': 0.0, 'wNow': -0.768, 'whLastSevenDays': 0.0, 'whLifetime': 0.0, 'whToday': 0.0, }), dict({ 'activeCount': 0, 'apprntPwr': -1.746, 'measurementType': 'net-consumption', 'pwrFactor': -1.0, 'reactPwr': 0.0, 'readingTime': 1694182274, 'rmsCurrent': -0.247, 'rmsVoltage': 238.786, 'type': 'eim', 'vahLifetime': 0.0, 'vahToday': 0, 'varhLagLifetime': 0.0, 'varhLagToday': 0, 'varhLeadLifetime': 0.0, 'varhLeadToday': 0, 'wNow': -1.409, 'whLastSevenDays': 0, 'whLifetime': 0.0, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 14, 'readingTime': 1694182262, 'type': 'inverters', 'wNow': 1322, 'whLifetime': 1152866, }), dict({ 'activeCount': 0, 'apprntPwr': 1.335, 'measurementType': 'production', 'pwrFactor': 1.0, 'reactPwr': 0.0, 'readingTime': 1694182274, 'rmsCurrent': 0.516, 'rmsVoltage': 235.291, 'type': 'eim', 'vahLifetime': 0.0, 'vahToday': 0.0, 'varhLagLifetime': 0.0, 'varhLagToday': 0.0, 'varhLeadLifetime': 0.0, 'varhLeadToday': 0.0, 'wNow': 0.641, 'whLastSevenDays': 0.0, 'whLifetime': 0.0, 'whToday': 0.0, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': None, 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 0, 'watt_hours_lifetime': 1152866, 'watt_hours_today': 0, 'watts_now': 1322, }), 'system_production_phases': None, 'tariff': dict({ 'currency': dict({ 'code': 'EUR', }), 'date': '1688623885', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'all_days', 'must_charge_duration': 0, 'must_charge_mode': 'CG', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'filler', 'rate': 0.38914, 'start': 0, }), dict({ 'id': 'period_1', 'rate': 0.4424, 'start': 420, }), dict({ 'id': 'filler', 'rate': 0.38914, 'start': 1381, }), ]), }), ]), 'id': 'all_year_long', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.38914, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1688623885', 'mode': , 'operation_mode_sub_type': '', 'reserved_soc': 30.0, 'very_low_soc': 10, }), }), }) # --- # name: test_with_7_x_firmware[7.6.175_with_cts] dict({ 'ctmeter_consumption': dict({ 'active_power': -36, 'current': 2.745, 'eid': 704643584, 'energy_delivered': 3738205, 'energy_received': 1776769, 'frequency': 50.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': -0.06, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 235.201, }), 'ctmeter_consumption_phases': None, 'ctmeter_production': dict({ 'active_power': 489, 'current': 2.169, 'eid': 704643328, 'energy_delivered': 3183794, 'energy_received': 8852, 'frequency': 50.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.957, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 235.236, }), 'ctmeter_production_phases': None, 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ }), 'dry_contact_status': dict({ }), 'encharge_aggregate': None, 'encharge_inventory': None, 'encharge_power': None, 'enpower': None, 'inverters': dict({ '121823030072': dict({ 'last_report_date': 1693745036, 'last_report_watts': 58, 'max_report_watts': 253, 'serial_number': '121823030072', }), '121823035149': dict({ 'last_report_date': 1693745066, 'last_report_watts': 56, 'max_report_watts': 254, 'serial_number': '121823035149', }), '482243031579': dict({ 'last_report_date': 1693744825, 'last_report_watts': 135, 'max_report_watts': 365, 'serial_number': '482243031579', }), '482243032888': dict({ 'last_report_date': 1693744828, 'last_report_watts': 133, 'max_report_watts': 365, 'serial_number': '482243032888', }), '482243032889': dict({ 'last_report_date': 1693744946, 'last_report_watts': 112, 'max_report_watts': 365, 'serial_number': '482243032889', }), '482243033444': dict({ 'last_report_date': 1693744829, 'last_report_watts': 127, 'max_report_watts': 365, 'serial_number': '482243033444', }), '482250079070': dict({ 'last_report_date': 1693744828, 'last_report_watts': 130, 'max_report_watts': 365, 'serial_number': '482250079070', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'battery_mode': 'self-consumption', 'charge_from_grid': False, 'date': '2023-06-29 15:50:12 UTC', 'operation_mode_sub_type': '', 'override': False, 'override_backup_soc': 30.0, 'override_chg_dischg_rate': 0.0, 'override_tou_mode': 'StorageTouMode_DEFAULT_TOU_MODE', 'reserved_soc': 0.0, 'schedule': dict({ 'Disable': list([ dict({ 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), ]), 'tariff': list([ dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'end': '1/1', 'start': '1/1', }), ]), }), 'source': 'Tariff', 'version': '00.00.02', 'very_low_soc': 5, }), 'tariff': dict({ 'currency': dict({ 'code': 'EUR', }), 'date': '1688053811', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'all_days', 'must_charge_duration': 0, 'must_charge_mode': 'CG', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.14, 'start': 480, }), dict({ 'id': 'filler', 'rate': 0.01, 'start': 1320, }), ]), }), ]), 'id': 'all_year_long', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.01, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1688053811', 'mode': 'self-consumption', 'operation_mode_sub_type': '', 'reserved_soc': 0.0, 'very_low_soc': 5, }), }), }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1693745036, 'lastReportWatts': 58, 'maxReportWatts': 253, 'serialNumber': '121823030072', }), dict({ 'devType': 1, 'lastReportDate': 1693745066, 'lastReportWatts': 56, 'maxReportWatts': 254, 'serialNumber': '121823035149', }), dict({ 'devType': 1, 'lastReportDate': 1693744825, 'lastReportWatts': 135, 'maxReportWatts': 365, 'serialNumber': '482243031579', }), dict({ 'devType': 1, 'lastReportDate': 1693744828, 'lastReportWatts': 133, 'maxReportWatts': 365, 'serialNumber': '482243032888', }), dict({ 'devType': 1, 'lastReportDate': 1693744828, 'lastReportWatts': 130, 'maxReportWatts': 365, 'serialNumber': '482250079070', }), dict({ 'devType': 1, 'lastReportDate': 1693744829, 'lastReportWatts': 127, 'maxReportWatts': 365, 'serialNumber': '482243033444', }), dict({ 'devType': 1, 'lastReportDate': 1693744946, 'lastReportWatts': 112, 'maxReportWatts': 365, 'serialNumber': '482243032889', }), ]), '/ivp/meters': list([ dict({ 'eid': 704643328, 'measurementType': 'production', 'meteringStatus': 'normal', 'phaseCount': 1, 'phaseMode': 'three', 'state': 'enabled', 'statusFlags': list([ ]), }), dict({ 'eid': 704643584, 'measurementType': 'net-consumption', 'meteringStatus': 'normal', 'phaseCount': 1, 'phaseMode': 'three', 'state': 'enabled', 'statusFlags': list([ ]), }), ]), '/ivp/meters/readings': list([ dict({ 'actEnergyDlvd': 3183793.885, 'actEnergyRcvd': 8851.704, 'activePower': 488.925, 'apparentEnergy': 3576167.385, 'apparentPower': 510.003, 'channels': list([ dict({ 'actEnergyDlvd': 3183793.885, 'actEnergyRcvd': 8851.704, 'activePower': 488.925, 'apparentEnergy': 3576167.385, 'apparentPower': 510.003, 'current': 2.169, 'eid': 1778385169, 'freq': 50.0, 'instantaneousDemand': 488.925, 'pwrFactor': 0.957, 'reactEnergyLagg': 591594.008, 'reactEnergyLead': 0.021, 'reactivePower': 114.596, 'timestamp': 1693745133, 'voltage': 235.236, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 5370.79, 'activePower': 0.0, 'apparentEnergy': 295.364, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385170, 'freq': 50.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 387.143, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1693745133, 'voltage': 6.124, }), dict({ 'actEnergyDlvd': 0.022, 'actEnergyRcvd': 9818.109, 'activePower': -1.044, 'apparentEnergy': 14032.684, 'apparentPower': 2.602, 'current': 0.227, 'eid': 1778385171, 'freq': 50.0, 'instantaneousDemand': -1.044, 'pwrFactor': -1.0, 'reactEnergyLagg': 391.775, 'reactEnergyLead': 2.189, 'reactivePower': -0.0, 'timestamp': 1693745133, 'voltage': 11.469, }), ]), 'current': 2.169, 'eid': 704643328, 'freq': 50.0, 'instantaneousDemand': 488.925, 'pwrFactor': 0.957, 'reactEnergyLagg': 591594.008, 'reactEnergyLead': 0.021, 'reactivePower': 114.596, 'timestamp': 1693745133, 'voltage': 235.236, }), dict({ 'actEnergyDlvd': 3738205.282, 'actEnergyRcvd': 1776768.769, 'activePower': -36.162, 'apparentEnergy': 7252190.779, 'apparentPower': 645.376, 'channels': list([ dict({ 'actEnergyDlvd': 3738205.282, 'actEnergyRcvd': 1776768.769, 'activePower': -36.162, 'apparentEnergy': 7252190.779, 'apparentPower': 645.376, 'current': 2.745, 'eid': 1778385425, 'freq': 50.0, 'instantaneousDemand': -36.162, 'pwrFactor': -0.06, 'reactEnergyLagg': 251.885, 'reactEnergyLead': 3174027.145, 'reactivePower': -568.304, 'timestamp': 1693745133, 'voltage': 235.201, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 8279.267, 'activePower': -0.0, 'apparentEnergy': 141.429, 'apparentPower': -0.0, 'current': 0.0, 'eid': 1778385426, 'freq': 50.0, 'instantaneousDemand': -0.0, 'pwrFactor': -1.0, 'reactEnergyLagg': 378.426, 'reactEnergyLead': 0.181, 'reactivePower': 0.0, 'timestamp': 1693745133, 'voltage': 2.981, }), dict({ 'actEnergyDlvd': 0.013, 'actEnergyRcvd': 13980.174, 'activePower': -0.451, 'apparentEnergy': 6016.263, 'apparentPower': 1.128, 'current': 0.242, 'eid': 1778385427, 'freq': 50.0, 'instantaneousDemand': -0.451, 'pwrFactor': 0.0, 'reactEnergyLagg': 380.215, 'reactEnergyLead': 1.245, 'reactivePower': 0.0, 'timestamp': 1693745133, 'voltage': 4.635, }), ]), 'current': 2.745, 'eid': 704643584, 'freq': 50.0, 'instantaneousDemand': -36.162, 'pwrFactor': -0.06, 'reactEnergyLagg': 251.885, 'reactEnergyLead': 3174027.145, 'reactivePower': -568.304, 'timestamp': 1693745133, 'voltage': 235.201, }), ]), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 1, 'apprntPwr': -144.999, 'measurementType': 'total-consumption', 'pwrFactor': 1.0, 'reactPwr': -456.848, 'readingTime': 1693745129, 'rmsCurrent': -0.615, 'rmsVoltage': 235.743, 'type': 'eim', 'vahLifetime': 7252190.009, 'vahToday': 22904.009, 'varhLagLifetime': -591341.987, 'varhLagToday': 0.0, 'varhLeadLifetime': 3174026.446, 'varhLeadToday': 9602.446, 'wNow': 476.686, 'whLastSevenDays': 4.621, 'whLifetime': 5145153.621, 'whToday': 19903.621, }), dict({ 'activeCount': 1, 'apprntPwr': -654.785, 'measurementType': 'net-consumption', 'pwrFactor': -1.0, 'reactPwr': -572.697, 'readingTime': 1693745129, 'rmsCurrent': -2.778, 'rmsVoltage': 235.743, 'type': 'eim', 'vahLifetime': 7252190.009, 'vahToday': 0, 'varhLagLifetime': 251.885, 'varhLagToday': 0, 'varhLeadLifetime': 3174026.466, 'varhLeadToday': 0, 'wNow': -11.468, 'whLastSevenDays': 0, 'whLifetime': 1961512.786, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 7, 'readingTime': 1693745066, 'type': 'inverters', 'wNow': 751, 'whLifetime': 702919, }), dict({ 'activeCount': 1, 'apprntPwr': 509.902, 'measurementType': 'production', 'pwrFactor': 0.97, 'reactPwr': 115.849, 'readingTime': 1693745129, 'rmsCurrent': 2.162, 'rmsVoltage': 235.777, 'type': 'eim', 'vahLifetime': 3576166.777, 'vahToday': 5461.777, 'varhLagLifetime': 591593.872, 'varhLagToday': 1483.872, 'varhLeadLifetime': 0.021, 'varhLeadToday': 0.021, 'wNow': 488.154, 'whLastSevenDays': 111093.303, 'whLifetime': 3183793.303, 'whToday': 4425.303, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': dict({ 'watt_hours_last_7_days': 5, 'watt_hours_lifetime': 5145154, 'watt_hours_today': 19904, 'watts_now': 477, }), 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 111093, 'watt_hours_lifetime': 3183793, 'watt_hours_today': 4425, 'watts_now': 488, }), 'system_production_phases': None, 'tariff': dict({ 'currency': dict({ 'code': 'EUR', }), 'date': '1688053811', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'all_days', 'must_charge_duration': 0, 'must_charge_mode': 'CG', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.14, 'start': 480, }), dict({ 'id': 'filler', 'rate': 0.01, 'start': 1320, }), ]), }), ]), 'id': 'all_year_long', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.01, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1688053811', 'mode': , 'operation_mode_sub_type': '', 'reserved_soc': 0.0, 'very_low_soc': 5, }), }), }) # --- # name: test_with_7_x_firmware[7.6.175_with_cts_3phase] dict({ 'ctmeter_consumption': dict({ 'active_power': -36, 'current': 2.745, 'eid': 704643584, 'energy_delivered': 3738205, 'energy_received': 1776769, 'frequency': 50.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': -0.06, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 235.201, }), 'ctmeter_consumption_phases': dict({ : dict({ 'active_power': -36, 'current': 2.745, 'eid': 1778385425, 'energy_delivered': 3738205, 'energy_received': 1776769, 'frequency': 50.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': -0.06, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 235.201, }), : dict({ 'active_power': 0, 'current': 0.0, 'eid': 1778385426, 'energy_delivered': 0, 'energy_received': 8279, 'frequency': 50.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': -1.0, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 2.981, }), : dict({ 'active_power': 0, 'current': 0.242, 'eid': 1778385427, 'energy_delivered': 0, 'energy_received': 13980, 'frequency': 50.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': 0.0, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 4.635, }), }), 'ctmeter_production': dict({ 'active_power': 489, 'current': 2.169, 'eid': 704643328, 'energy_delivered': 3183794, 'energy_received': 8852, 'frequency': 50.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.957, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 235.236, }), 'ctmeter_production_phases': dict({ : dict({ 'active_power': 489, 'current': 2.169, 'eid': 1778385169, 'energy_delivered': 3183794, 'energy_received': 8852, 'frequency': 50.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.957, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 235.236, }), : dict({ 'active_power': 0, 'current': 0.0, 'eid': 1778385170, 'energy_delivered': 0, 'energy_received': 5371, 'frequency': 50.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.0, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 6.124, }), : dict({ 'active_power': -1, 'current': 0.227, 'eid': 1778385171, 'energy_delivered': 0, 'energy_received': 9818, 'frequency': 50.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': -1.0, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1693745133, 'voltage': 11.469, }), }), 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ }), 'dry_contact_status': dict({ }), 'encharge_aggregate': None, 'encharge_inventory': None, 'encharge_power': None, 'enpower': None, 'inverters': dict({ '121823030072': dict({ 'last_report_date': 1693745036, 'last_report_watts': 58, 'max_report_watts': 253, 'serial_number': '121823030072', }), '121823035149': dict({ 'last_report_date': 1693745066, 'last_report_watts': 56, 'max_report_watts': 254, 'serial_number': '121823035149', }), '482243031579': dict({ 'last_report_date': 1693744825, 'last_report_watts': 135, 'max_report_watts': 365, 'serial_number': '482243031579', }), '482243032888': dict({ 'last_report_date': 1693744828, 'last_report_watts': 133, 'max_report_watts': 365, 'serial_number': '482243032888', }), '482243032889': dict({ 'last_report_date': 1693744946, 'last_report_watts': 112, 'max_report_watts': 365, 'serial_number': '482243032889', }), '482243033444': dict({ 'last_report_date': 1693744829, 'last_report_watts': 127, 'max_report_watts': 365, 'serial_number': '482243033444', }), '482250079070': dict({ 'last_report_date': 1693744828, 'last_report_watts': 130, 'max_report_watts': 365, 'serial_number': '482250079070', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'battery_mode': 'self-consumption', 'charge_from_grid': False, 'date': '2023-06-29 15:50:12 UTC', 'operation_mode_sub_type': '', 'override': False, 'override_backup_soc': 30.0, 'override_chg_dischg_rate': 0.0, 'override_tou_mode': 'StorageTouMode_DEFAULT_TOU_MODE', 'reserved_soc': 0.0, 'schedule': dict({ 'Disable': list([ dict({ 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), ]), 'tariff': list([ dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'end': '1/1', 'start': '1/1', }), ]), }), 'source': 'Tariff', 'version': '00.00.02', 'very_low_soc': 5, }), 'tariff': dict({ 'currency': dict({ 'code': 'EUR', }), 'date': '1688053811', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'all_days', 'must_charge_duration': 0, 'must_charge_mode': 'CG', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.14, 'start': 480, }), dict({ 'id': 'filler', 'rate': 0.01, 'start': 1320, }), ]), }), ]), 'id': 'all_year_long', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.01, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1688053811', 'mode': 'self-consumption', 'operation_mode_sub_type': '', 'reserved_soc': 0.0, 'very_low_soc': 5, }), }), }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1693745036, 'lastReportWatts': 58, 'maxReportWatts': 253, 'serialNumber': '121823030072', }), dict({ 'devType': 1, 'lastReportDate': 1693745066, 'lastReportWatts': 56, 'maxReportWatts': 254, 'serialNumber': '121823035149', }), dict({ 'devType': 1, 'lastReportDate': 1693744825, 'lastReportWatts': 135, 'maxReportWatts': 365, 'serialNumber': '482243031579', }), dict({ 'devType': 1, 'lastReportDate': 1693744828, 'lastReportWatts': 133, 'maxReportWatts': 365, 'serialNumber': '482243032888', }), dict({ 'devType': 1, 'lastReportDate': 1693744828, 'lastReportWatts': 130, 'maxReportWatts': 365, 'serialNumber': '482250079070', }), dict({ 'devType': 1, 'lastReportDate': 1693744829, 'lastReportWatts': 127, 'maxReportWatts': 365, 'serialNumber': '482243033444', }), dict({ 'devType': 1, 'lastReportDate': 1693744946, 'lastReportWatts': 112, 'maxReportWatts': 365, 'serialNumber': '482243032889', }), ]), '/ivp/meters': list([ dict({ 'eid': 704643328, 'measurementType': 'production', 'meteringStatus': 'normal', 'phaseCount': 3, 'phaseMode': 'three', 'state': 'enabled', 'statusFlags': list([ ]), }), dict({ 'eid': 704643584, 'measurementType': 'net-consumption', 'meteringStatus': 'normal', 'phaseCount': 3, 'phaseMode': 'three', 'state': 'enabled', 'statusFlags': list([ ]), }), ]), '/ivp/meters/readings': list([ dict({ 'actEnergyDlvd': 3183793.885, 'actEnergyRcvd': 8851.704, 'activePower': 488.925, 'apparentEnergy': 3576167.385, 'apparentPower': 510.003, 'channels': list([ dict({ 'actEnergyDlvd': 3183793.885, 'actEnergyRcvd': 8851.704, 'activePower': 488.925, 'apparentEnergy': 3576167.385, 'apparentPower': 510.003, 'current': 2.169, 'eid': 1778385169, 'freq': 50.0, 'instantaneousDemand': 488.925, 'pwrFactor': 0.957, 'reactEnergyLagg': 591594.008, 'reactEnergyLead': 0.021, 'reactivePower': 114.596, 'timestamp': 1693745133, 'voltage': 235.236, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 5370.79, 'activePower': 0.0, 'apparentEnergy': 295.364, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385170, 'freq': 50.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 387.143, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1693745133, 'voltage': 6.124, }), dict({ 'actEnergyDlvd': 0.022, 'actEnergyRcvd': 9818.109, 'activePower': -1.044, 'apparentEnergy': 14032.684, 'apparentPower': 2.602, 'current': 0.227, 'eid': 1778385171, 'freq': 50.0, 'instantaneousDemand': -1.044, 'pwrFactor': -1.0, 'reactEnergyLagg': 391.775, 'reactEnergyLead': 2.189, 'reactivePower': -0.0, 'timestamp': 1693745133, 'voltage': 11.469, }), ]), 'current': 2.169, 'eid': 704643328, 'freq': 50.0, 'instantaneousDemand': 488.925, 'pwrFactor': 0.957, 'reactEnergyLagg': 591594.008, 'reactEnergyLead': 0.021, 'reactivePower': 114.596, 'timestamp': 1693745133, 'voltage': 235.236, }), dict({ 'actEnergyDlvd': 3738205.282, 'actEnergyRcvd': 1776768.769, 'activePower': -36.162, 'apparentEnergy': 7252190.779, 'apparentPower': 645.376, 'channels': list([ dict({ 'actEnergyDlvd': 3738205.282, 'actEnergyRcvd': 1776768.769, 'activePower': -36.162, 'apparentEnergy': 7252190.779, 'apparentPower': 645.376, 'current': 2.745, 'eid': 1778385425, 'freq': 50.0, 'instantaneousDemand': -36.162, 'pwrFactor': -0.06, 'reactEnergyLagg': 251.885, 'reactEnergyLead': 3174027.145, 'reactivePower': -568.304, 'timestamp': 1693745133, 'voltage': 235.201, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 8279.267, 'activePower': -0.0, 'apparentEnergy': 141.429, 'apparentPower': -0.0, 'current': 0.0, 'eid': 1778385426, 'freq': 50.0, 'instantaneousDemand': -0.0, 'pwrFactor': -1.0, 'reactEnergyLagg': 378.426, 'reactEnergyLead': 0.181, 'reactivePower': 0.0, 'timestamp': 1693745133, 'voltage': 2.981, }), dict({ 'actEnergyDlvd': 0.013, 'actEnergyRcvd': 13980.174, 'activePower': -0.451, 'apparentEnergy': 6016.263, 'apparentPower': 1.128, 'current': 0.242, 'eid': 1778385427, 'freq': 50.0, 'instantaneousDemand': -0.451, 'pwrFactor': 0.0, 'reactEnergyLagg': 380.215, 'reactEnergyLead': 1.245, 'reactivePower': 0.0, 'timestamp': 1693745133, 'voltage': 4.635, }), ]), 'current': 2.745, 'eid': 704643584, 'freq': 50.0, 'instantaneousDemand': -36.162, 'pwrFactor': -0.06, 'reactEnergyLagg': 251.885, 'reactEnergyLead': 3174027.145, 'reactivePower': -568.304, 'timestamp': 1693745133, 'voltage': 235.201, }), ]), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 1, 'apprntPwr': 1929.904, 'lines': list([ dict({ 'apprntPwr': 306.73, 'pwrFactor': 0.29, 'reactPwr': -257.565, 'rmsCurrent': 1.295, 'rmsVoltage': 236.836, 'vahLifetime': 4268391.905, 'vahToday': 10866.905, 'varhLagLifetime': 578414.935, 'varhLagToday': 1188.935, 'varhLeadLifetime': 2114284.979, 'varhLeadToday': 4108.979, 'wNow': 88.573, 'whLastSevenDays': 39391.928, 'whLifetime': 2293782.928, 'whToday': 8584.928, }), dict({ 'apprntPwr': 204.919, 'pwrFactor': 0.6, 'reactPwr': -132.184, 'rmsCurrent': 0.861, 'rmsVoltage': 237.934, 'vahLifetime': 2331874.944, 'vahToday': 4293.944, 'varhLagLifetime': 383807.966, 'varhLagToday': 815.966, 'varhLeadLifetime': 1059082.625, 'varhLeadToday': 2783.625, 'wNow': 123.364, 'whLastSevenDays': 18948.969, 'whLifetime': 948057.969, 'whToday': 2154.969, }), dict({ 'apprntPwr': 131.213, 'pwrFactor': -0.02, 'reactPwr': -75.026, 'rmsCurrent': 0.551, 'rmsVoltage': 237.956, 'vahLifetime': 2134819.346, 'vahToday': 3787.346, 'varhLagLifetime': 379329.532, 'varhLagToday': 797.532, 'varhLeadLifetime': 763032.665, 'varhLeadToday': 1331.665, 'wNow': -2.853, 'whLastSevenDays': 10443.471, 'whLifetime': 832954.471, 'whToday': 1683.471, }), ]), 'measurementType': 'total-consumption', 'pwrFactor': 0.11, 'reactPwr': -464.776, 'readingTime': 1693433002, 'rmsCurrent': 2.708, 'rmsVoltage': 712.725, 'type': 'eim', 'vahLifetime': 8735086.195, 'vahToday': 18948.195, 'varhLagLifetime': 1341552.434, 'varhLagToday': 2802.434, 'varhLeadLifetime': 3936400.269, 'varhLeadToday': 8224.269, 'wNow': 209.084, 'whLastSevenDays': 68784.368, 'whLifetime': 4074795.368, 'whToday': 12423.368, }), dict({ 'activeCount': 1, 'apprntPwr': 487.922, 'lines': list([ dict({ 'apprntPwr': 238.691, 'pwrFactor': 0.41, 'reactPwr': -206.71, 'rmsCurrent': 1.009, 'rmsVoltage': 236.905, 'vahLifetime': 4268391.905, 'vahToday': 0, 'varhLagLifetime': 38719.874, 'varhLagToday': 0, 'varhLeadLifetime': 2114284.977, 'varhLeadToday': 0, 'wNow': 91.437, 'whLastSevenDays': 0, 'whLifetime': 1625201.414, 'whToday': 0, }), dict({ 'apprntPwr': 206.35, 'pwrFactor': 0.61, 'reactPwr': -132.184, 'rmsCurrent': 0.861, 'rmsVoltage': 237.949, 'vahLifetime': 2331874.944, 'vahToday': 0, 'varhLagLifetime': 16968.583, 'varhLagToday': 0, 'varhLeadLifetime': 1059082.624, 'varhLeadToday': 0, 'wNow': 123.364, 'whLastSevenDays': 0, 'whLifetime': 629892.171, 'whToday': 0, }), dict({ 'apprntPwr': 42.881, 'pwrFactor': 0.0, 'reactPwr': -41.336, 'rmsCurrent': 0.179, 'rmsVoltage': 238.007, 'vahLifetime': 2134819.346, 'vahToday': 0, 'varhLagLifetime': 20983.605, 'varhLagToday': 0, 'varhLeadLifetime': 763032.663, 'varhLeadToday': 0, 'wNow': 0.764, 'whLastSevenDays': 0, 'whLifetime': 631468.875, 'whToday': 0, }), ]), 'measurementType': 'net-consumption', 'pwrFactor': 0.46, 'reactPwr': -380.23, 'readingTime': 1693433002, 'rmsCurrent': 2.05, 'rmsVoltage': 712.862, 'type': 'eim', 'vahLifetime': 8735086.195, 'vahToday': 0, 'varhLagLifetime': 76672.062, 'varhLagToday': 0, 'varhLeadLifetime': 3936400.264, 'varhLeadToday': 0, 'wNow': 215.565, 'whLastSevenDays': 0, 'whLifetime': 2886562.459, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 7, 'readingTime': 0, 'type': 'inverters', 'wNow': 0, 'whLifetime': 4339764, }), dict({ 'activeCount': 1, 'apprntPwr': 156.055, 'lines': list([ dict({ 'apprntPwr': 67.699, 'pwrFactor': 0.0, 'reactPwr': 50.856, 'rmsCurrent': 0.286, 'rmsVoltage': 236.766, 'vahLifetime': 2377390.886, 'vahToday': 3576.886, 'varhLagLifetime': 539695.061, 'varhLagToday': 1163.061, 'varhLeadLifetime': 0.002, 'varhLeadToday': 0.002, 'wNow': -2.864, 'whLastSevenDays': 29891.394, 'whLifetime': 1869678.394, 'whToday': 2200.394, }), dict({ 'apprntPwr': -0.0, 'pwrFactor': 0.0, 'reactPwr': 0.0, 'rmsCurrent': -0.0, 'rmsVoltage': 237.918, 'vahLifetime': 1241038.844, 'vahToday': 1528.844, 'varhLagLifetime': 366839.383, 'varhLagToday': 792.383, 'varhLeadLifetime': 0.001, 'varhLeadToday': 0.001, 'wNow': 0.0, 'whLastSevenDays': 19793.645, 'whLifetime': 1241245.645, 'whToday': 1454.645, }), dict({ 'apprntPwr': 88.355, 'pwrFactor': 0.0, 'reactPwr': 33.69, 'rmsCurrent': 0.372, 'rmsVoltage': 237.904, 'vahLifetime': 1941098.256, 'vahToday': 3191.256, 'varhLagLifetime': 358345.928, 'varhLagToday': 771.928, 'varhLeadLifetime': 0.002, 'varhLeadToday': 0.002, 'wNow': -3.617, 'whLastSevenDays': 19807.161, 'whLifetime': 1240189.161, 'whToday': 1458.161, }), ]), 'measurementType': 'production', 'pwrFactor': 0.0, 'reactPwr': 84.546, 'readingTime': 1693433002, 'rmsCurrent': 0.658, 'rmsVoltage': 712.588, 'type': 'eim', 'vahLifetime': 5559527.987, 'vahToday': 8296.987, 'varhLagLifetime': 1264880.372, 'varhLagToday': 2727.372, 'varhLeadLifetime': 0.005, 'varhLeadToday': 0.005, 'wNow': -6.481, 'whLastSevenDays': 69492.2, 'whLifetime': 4351113.2, 'whToday': 5113.2, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': dict({ 'watt_hours_last_7_days': 68784, 'watt_hours_lifetime': 4074795, 'watt_hours_today': 12423, 'watts_now': 209, }), 'system_consumption_phases': dict({ : dict({ 'watt_hours_last_7_days': 39392, 'watt_hours_lifetime': 2293783, 'watt_hours_today': 8585, 'watts_now': 89, }), : dict({ 'watt_hours_last_7_days': 18949, 'watt_hours_lifetime': 948058, 'watt_hours_today': 2155, 'watts_now': 123, }), : dict({ 'watt_hours_last_7_days': 10443, 'watt_hours_lifetime': 832954, 'watt_hours_today': 1683, 'watts_now': -3, }), }), 'system_production': dict({ 'watt_hours_last_7_days': 69492, 'watt_hours_lifetime': 4351113, 'watt_hours_today': 5113, 'watts_now': -6, }), 'system_production_phases': dict({ : dict({ 'watt_hours_last_7_days': 29891, 'watt_hours_lifetime': 1869678, 'watt_hours_today': 2200, 'watts_now': -3, }), : dict({ 'watt_hours_last_7_days': 19794, 'watt_hours_lifetime': 1241246, 'watt_hours_today': 1455, 'watts_now': 0, }), : dict({ 'watt_hours_last_7_days': 19807, 'watt_hours_lifetime': 1240189, 'watt_hours_today': 1458, 'watts_now': -4, }), }), 'tariff': dict({ 'currency': dict({ 'code': 'EUR', }), 'date': '1688053811', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'all_days', 'must_charge_duration': 0, 'must_charge_mode': 'CG', 'must_charge_start': 0, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.14, 'start': 480, }), dict({ 'id': 'filler', 'rate': 0.01, 'start': 1320, }), ]), }), ]), 'id': 'all_year_long', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.01, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1688053811', 'mode': , 'operation_mode_sub_type': '', 'reserved_soc': 0.0, 'very_low_soc': 5, }), }), }) # --- # name: test_with_7_x_firmware[7.6.185_with_cts_and_battery_3t] dict({ 'ctmeter_consumption': dict({ 'active_power': 522, 'current': 3.138, 'eid': 704643584, 'energy_delivered': 2404339, 'energy_received': 1125590, 'frequency': 50.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': 0.706, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1695769632, 'voltage': 238.282, }), 'ctmeter_consumption_phases': None, 'ctmeter_production': dict({ 'active_power': -1, 'current': 0.386, 'eid': 704643328, 'energy_delivered': 2432970, 'energy_received': 1795, 'frequency': 50.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.0, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1695769632, 'voltage': 238.524, }), 'ctmeter_production_phases': None, 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ }), 'dry_contact_status': dict({ }), 'encharge_aggregate': dict({ 'available_energy': 525, 'backup_reserve': 525, 'configured_reserve_state_of_charge': 15, 'max_available_capacity': 3500, 'reserve_state_of_charge': 15, 'state_of_charge': 15, }), 'encharge_inventory': dict({ '122249097612': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '2.1.34', 'comm_level_2_4_ghz': 4, 'comm_level_sub_ghz': 4, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 3500, 'encharge_revision': 2, 'firmware_loaded_date': 1695330323, 'firmware_version': '2.6.5973_rel/22.11', 'installed_date': 1695330323, 'last_report_date': 1695769447, 'led_status': 17, 'max_cell_temp': 30, 'operating': True, 'part_number': '830-01760-r37', 'percent_full': 15, 'serial_number': '122249097612', 'temperature': 29, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': '100F', }), }), 'encharge_power': dict({ '122249097612': dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'soc': 15, }), }), 'enpower': None, 'inverters': dict({ '482243033093': dict({ 'last_report_date': 1695752940, 'last_report_watts': 0, 'max_report_watts': 362, 'serial_number': '482243033093', }), '482243033113': dict({ 'last_report_date': 1695752919, 'last_report_watts': 0, 'max_report_watts': 361, 'serial_number': '482243033113', }), '482246043645': dict({ 'last_report_date': 1695752947, 'last_report_watts': 0, 'max_report_watts': 361, 'serial_number': '482246043645', }), '482246047675': dict({ 'last_report_date': 1695752865, 'last_report_watts': 0, 'max_report_watts': 361, 'serial_number': '482246047675', }), '482246047880': dict({ 'last_report_date': 1695752936, 'last_report_watts': 0, 'max_report_watts': 360, 'serial_number': '482246047880', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'battery_mode': 'self-consumption', 'charge_from_grid': True, 'date': '2023-09-26 16:03:40 UTC', 'operation_mode_sub_type': '', 'override': False, 'override_backup_soc': 30.0, 'override_chg_dischg_rate': 0.0, 'override_tou_mode': 'StorageTouMode_DEFAULT_TOU_MODE', 'reserved_soc': 15.0, 'schedule': dict({ 'Disable': list([ dict({ 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), ]), 'tariff': list([ dict({ 'Fri': list([ dict({ 'duration': 444, 'setting': 'ZN', 'start': 0, }), dict({ 'duration': 35, 'setting': 'CG', 'start': 444, }), dict({ 'duration': 961, 'setting': 'ZN', 'start': 479, }), ]), 'Mon': list([ dict({ 'duration': 444, 'setting': 'ZN', 'start': 0, }), dict({ 'duration': 35, 'setting': 'CG', 'start': 444, }), dict({ 'duration': 961, 'setting': 'ZN', 'start': 479, }), ]), 'Sat': list([ dict({ 'duration': 444, 'setting': 'ZN', 'start': 0, }), dict({ 'duration': 35, 'setting': 'CG', 'start': 444, }), dict({ 'duration': 961, 'setting': 'ZN', 'start': 479, }), ]), 'Sun': list([ dict({ 'duration': 444, 'setting': 'ZN', 'start': 0, }), dict({ 'duration': 35, 'setting': 'CG', 'start': 444, }), dict({ 'duration': 961, 'setting': 'ZN', 'start': 479, }), ]), 'Thu': list([ dict({ 'duration': 444, 'setting': 'ZN', 'start': 0, }), dict({ 'duration': 35, 'setting': 'CG', 'start': 444, }), dict({ 'duration': 961, 'setting': 'ZN', 'start': 479, }), ]), 'Tue': list([ dict({ 'duration': 444, 'setting': 'ZN', 'start': 0, }), dict({ 'duration': 35, 'setting': 'CG', 'start': 444, }), dict({ 'duration': 961, 'setting': 'ZN', 'start': 479, }), ]), 'Wed': list([ dict({ 'duration': 444, 'setting': 'ZN', 'start': 0, }), dict({ 'duration': 35, 'setting': 'CG', 'start': 444, }), dict({ 'duration': 961, 'setting': 'ZN', 'start': 479, }), ]), 'end': '1/1', 'start': '1/1', }), ]), }), 'source': 'Tariff', 'version': '00.00.02', 'very_low_soc': 5, }), 'tariff': dict({ 'currency': dict({ 'code': 'EUR', }), 'date': '1695744220', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': True, 'id': 'all_days', 'must_charge_duration': 35, 'must_charge_mode': 'CG', 'must_charge_start': 444, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.1898, 'start': 480, }), dict({ 'id': 'filler', 'rate': 0.1034, 'start': 1320, }), ]), }), ]), 'id': 'season_1', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.0, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': True, 'date': '1695598084', 'mode': 'self-consumption', 'operation_mode_sub_type': '', 'reserved_soc': 15.0, 'very_low_soc': 5, }), }), }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1695752919, 'lastReportWatts': 0, 'maxReportWatts': 361, 'serialNumber': '482243033113', }), dict({ 'devType': 1, 'lastReportDate': 1695752947, 'lastReportWatts': 0, 'maxReportWatts': 361, 'serialNumber': '482246043645', }), dict({ 'devType': 1, 'lastReportDate': 1695752865, 'lastReportWatts': 0, 'maxReportWatts': 361, 'serialNumber': '482246047675', }), dict({ 'devType': 1, 'lastReportDate': 1695752936, 'lastReportWatts': 0, 'maxReportWatts': 360, 'serialNumber': '482246047880', }), dict({ 'devType': 1, 'lastReportDate': 1695752940, 'lastReportWatts': 0, 'maxReportWatts': 362, 'serialNumber': '482243033093', }), ]), '/ivp/ensemble/inventory': list([ dict({ 'devices': list([ dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '2.1.34', 'comm_level_2_4_ghz': 4, 'comm_level_sub_ghz': 4, 'communicating': True, 'created_date': 1695330323, 'dc_switch_off': False, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 3500, 'encharge_rev': 2, 'img_load_date': 1695330323, 'img_pnum_running': '2.6.5973_rel/22.11', 'installed': 1695330323, 'last_rpt_date': 1695769447, 'led_status': 17, 'maxCellTemp': 30, 'operating': True, 'part_num': '830-01760-r37', 'percentFull': 15, 'serial_num': '122249097612', 'sleep_enabled': False, 'temperature': 29, 'zigbee_dongle_fw_version': '100F', }), ]), 'type': 'ENCHARGE', }), ]), '/ivp/ensemble/power': dict({ 'devices:': list([ dict({ 'apparent_power_mva': 0, 'real_power_mw': 0, 'serial_num': '122249097612', 'soc': 15, }), ]), }), '/ivp/ensemble/secctrl': dict({ 'ACB_agg_energy': 0, 'ACB_agg_soc': 0, 'ENC_agg_avail_energy': 525, 'ENC_agg_backup_energy': 525, 'ENC_agg_soc': 15, 'ENC_agg_soh': 100, 'Enc_commissioned_capacity': 3500, 'Enc_max_available_capacity': 3500, 'Max_energy': 3500, 'adjusted_backup_soc': 15, 'agg_soc': 15, 'configured_backup_soc': 15, 'freq_bias_hz': 1.3899999856948853, 'freq_bias_hz_phaseb': 0.0, 'freq_bias_hz_phasec': 0.0, 'freq_bias_hz_q8': 2235, 'freq_bias_hz_q8_phaseb': 0, 'freq_bias_hz_q8_phasec': 0, 'shutdown': False, 'voltage_bias_v': 16.899999618530273, 'voltage_bias_v_phaseb': 0.0, 'voltage_bias_v_phasec': 0.0, 'voltage_bias_v_q5': 540, 'voltage_bias_v_q5_phaseb': 0, 'voltage_bias_v_q5_phasec': 0, }), '/ivp/meters': list([ dict({ 'eid': 704643328, 'measurementType': 'production', 'meteringStatus': 'normal', 'phaseCount': 1, 'phaseMode': 'three', 'state': 'enabled', 'statusFlags': list([ ]), }), dict({ 'eid': 704643584, 'measurementType': 'net-consumption', 'meteringStatus': 'normal', 'phaseCount': 1, 'phaseMode': 'three', 'state': 'enabled', 'statusFlags': list([ ]), }), ]), '/ivp/meters/readings': list([ dict({ 'actEnergyDlvd': 2432969.956, 'actEnergyRcvd': 1795.013, 'activePower': -0.661, 'apparentEnergy': 2709025.378, 'apparentPower': 92.126, 'channels': list([ dict({ 'actEnergyDlvd': 2432969.956, 'actEnergyRcvd': 1795.013, 'activePower': -0.661, 'apparentEnergy': 2709025.378, 'apparentPower': 92.126, 'current': 0.386, 'eid': 1778385169, 'freq': 50.0, 'instantaneousDemand': -0.661, 'pwrFactor': 0.0, 'reactEnergyLagg': 392075.354, 'reactEnergyLead': 7.266, 'reactivePower': 82.942, 'timestamp': 1695769632, 'voltage': 238.524, }), dict({ 'actEnergyDlvd': 0.013, 'actEnergyRcvd': 8248.228, 'activePower': -0.0, 'apparentEnergy': 140.353, 'apparentPower': -0.0, 'current': -0.0, 'eid': 1778385170, 'freq': 50.0, 'instantaneousDemand': -0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 355.453, 'reactEnergyLead': 1.715, 'reactivePower': -0.0, 'timestamp': 1695769632, 'voltage': 7.648, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 12408.486, 'activePower': -0.077, 'apparentEnergy': 898.304, 'apparentPower': 0.178, 'current': 0.152, 'eid': 1778385171, 'freq': 50.0, 'instantaneousDemand': -0.077, 'pwrFactor': -1.0, 'reactEnergyLagg': 419.396, 'reactEnergyLead': 0.0, 'reactivePower': -0.0, 'timestamp': 1695769632, 'voltage': 1.176, }), ]), 'current': 0.386, 'eid': 704643328, 'freq': 50.0, 'instantaneousDemand': -0.661, 'pwrFactor': 0.0, 'reactEnergyLagg': 392075.354, 'reactEnergyLead': 7.266, 'reactivePower': 82.942, 'timestamp': 1695769632, 'voltage': 238.524, }), dict({ 'actEnergyDlvd': 2404339.266, 'actEnergyRcvd': 1125590.088, 'activePower': 522.043, 'apparentEnergy': 4833861.616, 'apparentPower': 746.438, 'channels': list([ dict({ 'actEnergyDlvd': 2404339.266, 'actEnergyRcvd': 1125590.088, 'activePower': 522.043, 'apparentEnergy': 4833861.616, 'apparentPower': 746.438, 'current': 3.138, 'eid': 1778385425, 'freq': 50.0, 'instantaneousDemand': 522.043, 'pwrFactor': 0.706, 'reactEnergyLagg': 22501.684, 'reactEnergyLead': 1935715.22, 'reactivePower': -458.984, 'timestamp': 1695769632, 'voltage': 238.282, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 1099.941, 'activePower': 0.0, 'apparentEnergy': 54.285, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385426, 'freq': 50.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 356.336, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1695769632, 'voltage': 3.447, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 5670.302, 'activePower': -0.351, 'apparentEnergy': 8802.177, 'apparentPower': 1.761, 'current': 0.197, 'eid': 1778385427, 'freq': 50.0, 'instantaneousDemand': -0.351, 'pwrFactor': 0.0, 'reactEnergyLagg': 361.519, 'reactEnergyLead': 0.367, 'reactivePower': -0.0, 'timestamp': 1695769632, 'voltage': 8.942, }), ]), 'current': 3.138, 'eid': 704643584, 'freq': 50.0, 'instantaneousDemand': 522.043, 'pwrFactor': 0.706, 'reactEnergyLagg': 22501.684, 'reactEnergyLead': 1935715.22, 'reactivePower': -458.984, 'timestamp': 1695769632, 'voltage': 238.282, }), ]), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 1, 'apprntPwr': 837.87, 'measurementType': 'total-consumption', 'pwrFactor': 0.62, 'reactPwr': -374.915, 'readingTime': 1695769629, 'rmsCurrent': 3.513, 'rmsVoltage': 238.507, 'type': 'eim', 'vahLifetime': 4833860.766, 'vahToday': 88.766, 'varhLagLifetime': -369573.576, 'varhLagToday': 0.0, 'varhLeadLifetime': 1935707.431, 'varhLeadToday': 54.431, 'wNow': 523.579, 'whLastSevenDays': 19.155, 'whLifetime': 3711429.155, 'whToday': 63.155, }), dict({ 'activeCount': 1, 'apprntPwr': 745.663, 'measurementType': 'net-consumption', 'pwrFactor': 0.7, 'reactPwr': -458.436, 'readingTime': 1695769629, 'rmsCurrent': 3.126, 'rmsVoltage': 238.507, 'type': 'eim', 'vahLifetime': 4833860.766, 'vahToday': 0, 'varhLagLifetime': 22501.684, 'varhLagToday': 0, 'varhLeadLifetime': 1935714.697, 'varhLeadToday': 0, 'wNow': 524.536, 'whLastSevenDays': 0, 'whLifetime': 1279037.969, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 5, 'readingTime': 0, 'type': 'inverters', 'wNow': 0, 'whLifetime': 45349, }), dict({ 'activeCount': 1, 'apprntPwr': 92.383, 'measurementType': 'production', 'pwrFactor': 0.0, 'reactPwr': 83.521, 'readingTime': 1695769629, 'rmsCurrent': 0.387, 'rmsVoltage': 238.522, 'type': 'eim', 'vahLifetime': 2709025.274, 'vahToday': 11.274, 'varhLagLifetime': 392075.259, 'varhLagToday': 10.259, 'varhLeadLifetime': 7.266, 'varhLeadToday': 0.266, 'wNow': -0.957, 'whLastSevenDays': 73002.956, 'whLifetime': 2432969.956, 'whToday': 0.956, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': dict({ 'watt_hours_last_7_days': 19, 'watt_hours_lifetime': 3711429, 'watt_hours_today': 63, 'watts_now': 524, }), 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 73003, 'watt_hours_lifetime': 2432970, 'watt_hours_today': 1, 'watts_now': -1, }), 'system_production_phases': None, 'tariff': dict({ 'currency': dict({ 'code': 'EUR', }), 'date': '1695744220', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': True, 'id': 'all_days', 'must_charge_duration': 35, 'must_charge_mode': 'CG', 'must_charge_start': 444, 'periods': list([ dict({ 'id': 'period_1', 'rate': 0.1898, 'start': 480, }), dict({ 'id': 'filler', 'rate': 0.1034, 'start': 1320, }), ]), }), ]), 'id': 'season_1', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.0, 'sell': 0.0, }), 'storage_settings': dict({ 'charge_from_grid': True, 'date': '1695598084', 'mode': , 'operation_mode_sub_type': '', 'reserved_soc': 15.0, 'very_low_soc': 5, }), }), }) # --- # name: test_with_7_x_firmware[8.1.41] dict({ 'ctmeter_consumption': None, 'ctmeter_consumption_phases': None, 'ctmeter_production': None, 'ctmeter_production_phases': None, 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ 'NC1': dict({ 'black_start': 5.0, 'essential_end_time': 82800.0, 'essential_start_time': 21600.0, 'generator_action': , 'grid_action': , 'id': 'NC1', 'load_name': 'Furnace', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': True, 'priority': 1.0, 'pv_serial_nb': list([ ]), 'soc_high': 40.0, 'soc_low': 30.0, 'type': , }), 'NC2': dict({ 'black_start': 5.0, 'essential_end_time': 82800.0, 'essential_start_time': 21600.0, 'generator_action': , 'grid_action': , 'id': 'NC2', 'load_name': 'AC', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': True, 'priority': 2.0, 'pv_serial_nb': list([ ]), 'soc_high': 40.0, 'soc_low': 30.0, 'type': , }), 'NO1': dict({ 'black_start': 5.0, 'essential_end_time': 82800.0, 'essential_start_time': 21600.0, 'generator_action': , 'grid_action': , 'id': 'NO1', 'load_name': '', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': False, 'priority': 3.0, 'pv_serial_nb': list([ ]), 'soc_high': 40.0, 'soc_low': 30.0, 'type': , }), 'NO2': dict({ 'black_start': 5.0, 'essential_end_time': 82800.0, 'essential_start_time': 21600.0, 'generator_action': , 'grid_action': , 'id': 'NO2', 'load_name': '', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': False, 'priority': 4.0, 'pv_serial_nb': list([ ]), 'soc_high': 40.0, 'soc_low': 30.0, 'type': , }), }), 'dry_contact_status': dict({ 'NC1': dict({ 'id': 'NC1', 'status': , }), 'NC2': dict({ 'id': 'NC2', 'status': , }), 'NO1': dict({ 'id': 'NO1', 'status': , }), 'NO2': dict({ 'id': 'NO2', 'status': , }), }), 'encharge_aggregate': dict({ 'available_energy': 9176, 'backup_reserve': 2976, 'configured_reserve_state_of_charge': 30, 'max_available_capacity': 9920, 'reserve_state_of_charge': 30, 'state_of_charge': 92, }), 'encharge_inventory': dict({ '492319002585': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '3.8.53', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 4960, 'encharge_revision': 3, 'firmware_loaded_date': 1691560591, 'firmware_version': '3.0.5949_rel/31.07', 'installed_date': 1691560591, 'last_report_date': 1692385816, 'led_status': 14, 'max_cell_temp': 42, 'operating': None, 'part_number': '836-01826-r76', 'percent_full': 100, 'serial_number': '492319002585', 'temperature': 42, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': None, }), '492319002593': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '3.8.53', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 4960, 'encharge_revision': 3, 'firmware_loaded_date': 1691560590, 'firmware_version': '3.0.5949_rel/31.07', 'installed_date': 1691560590, 'last_report_date': 1692386075, 'led_status': 14, 'max_cell_temp': 42, 'operating': None, 'part_number': '836-01826-r76', 'percent_full': 85, 'serial_number': '492319002593', 'temperature': 42, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': None, }), }), 'encharge_power': dict({ '492319002585': dict({ 'apparent_power_mva': 24000, 'real_power_mw': 24000, 'soc': 100, }), '492319002593': dict({ 'apparent_power_mva': 16000, 'real_power_mw': 16000, 'soc': 85, }), }), 'enpower': dict({ 'admin_state': 24, 'admin_state_str': 'ENPWR_STATE_OPER_CLOSED', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'firmware_loaded_date': 1691648499, 'firmware_version': '3.0.5177_rel/31.07', 'grid_mode': 'multimode-ongrid', 'installed_date': 1691648499, 'last_report_date': 1692386076, 'mains_admin_state': 'closed', 'mains_oper_state': 'closed', 'operating': None, 'part_number': '865-00377-r28', 'serial_number': '482326083757', 'temperature': 113, 'temperature_unit': 'F', 'zigbee_dongle_fw_version': None, }), 'inverters': dict({ '202314050286': dict({ 'last_report_date': 1692385966, 'last_report_watts': 312, 'max_report_watts': 327, 'serial_number': '202314050286', }), '202314055790': dict({ 'last_report_date': 1692385969, 'last_report_watts': 305, 'max_report_watts': 321, 'serial_number': '202314055790', }), '202314058203': dict({ 'last_report_date': 1692385784, 'last_report_watts': 310, 'max_report_watts': 321, 'serial_number': '202314058203', }), '202314059855': dict({ 'last_report_date': 1692385973, 'last_report_watts': 309, 'max_report_watts': 322, 'serial_number': '202314059855', }), '202314060891': dict({ 'last_report_date': 1692385785, 'last_report_watts': 305, 'max_report_watts': 321, 'serial_number': '202314060891', }), '202314061330': dict({ 'last_report_date': 1692385997, 'last_report_watts': 269, 'max_report_watts': 336, 'serial_number': '202314061330', }), '202314062224': dict({ 'last_report_date': 1692385974, 'last_report_watts': 304, 'max_report_watts': 318, 'serial_number': '202314062224', }), '202314062558': dict({ 'last_report_date': 1692385971, 'last_report_watts': 301, 'max_report_watts': 322, 'serial_number': '202314062558', }), '202314062880': dict({ 'last_report_date': 1692386026, 'last_report_watts': 275, 'max_report_watts': 335, 'serial_number': '202314062880', }), '202314063524': dict({ 'last_report_date': 1692385998, 'last_report_watts': 276, 'max_report_watts': 337, 'serial_number': '202314063524', }), '202314064007': dict({ 'last_report_date': 1692386029, 'last_report_watts': 307, 'max_report_watts': 325, 'serial_number': '202314064007', }), '202314065032': dict({ 'last_report_date': 1692386029, 'last_report_watts': 273, 'max_report_watts': 336, 'serial_number': '202314065032', }), '202314065062': dict({ 'last_report_date': 1692385935, 'last_report_watts': 277, 'max_report_watts': 334, 'serial_number': '202314065062', }), '202314065647': dict({ 'last_report_date': 1692385969, 'last_report_watts': 303, 'max_report_watts': 319, 'serial_number': '202314065647', }), '202314066216': dict({ 'last_report_date': 1692385965, 'last_report_watts': 309, 'max_report_watts': 319, 'serial_number': '202314066216', }), '202314067482': dict({ 'last_report_date': 1692385977, 'last_report_watts': 302, 'max_report_watts': 318, 'serial_number': '202314067482', }), '202314068272': dict({ 'last_report_date': 1692385786, 'last_report_watts': 311, 'max_report_watts': 324, 'serial_number': '202314068272', }), '202314068438': dict({ 'last_report_date': 1692385979, 'last_report_watts': 293, 'max_report_watts': 324, 'serial_number': '202314068438', }), '202314068868': dict({ 'last_report_date': 1692385904, 'last_report_watts': 304, 'max_report_watts': 318, 'serial_number': '202314068868', }), '202314069065': dict({ 'last_report_date': 1692385847, 'last_report_watts': 303, 'max_report_watts': 320, 'serial_number': '202314069065', }), '202314069086': dict({ 'last_report_date': 1692385968, 'last_report_watts': 313, 'max_report_watts': 323, 'serial_number': '202314069086', }), '202314069092': dict({ 'last_report_date': 1692385980, 'last_report_watts': 309, 'max_report_watts': 319, 'serial_number': '202314069092', }), '202314069944': dict({ 'last_report_date': 1692385814, 'last_report_watts': 277, 'max_report_watts': 336, 'serial_number': '202314069944', }), '202314070107': dict({ 'last_report_date': 1692385971, 'last_report_watts': 308, 'max_report_watts': 317, 'serial_number': '202314070107', }), '202314070295': dict({ 'last_report_date': 1692386032, 'last_report_watts': 275, 'max_report_watts': 335, 'serial_number': '202314070295', }), '202314070321': dict({ 'last_report_date': 1692386030, 'last_report_watts': 271, 'max_report_watts': 329, 'serial_number': '202314070321', }), '202314070523': dict({ 'last_report_date': 1692385978, 'last_report_watts': 305, 'max_report_watts': 320, 'serial_number': '202314070523', }), '202314070647': dict({ 'last_report_date': 1692385939, 'last_report_watts': 301, 'max_report_watts': 319, 'serial_number': '202314070647', }), '202314070713': dict({ 'last_report_date': 1692385936, 'last_report_watts': 309, 'max_report_watts': 326, 'serial_number': '202314070713', }), '202314070988': dict({ 'last_report_date': 1692386027, 'last_report_watts': 275, 'max_report_watts': 334, 'serial_number': '202314070988', }), '202314071516': dict({ 'last_report_date': 1692386025, 'last_report_watts': 308, 'max_report_watts': 321, 'serial_number': '202314071516', }), '202314071599': dict({ 'last_report_date': 1692385978, 'last_report_watts': 307, 'max_report_watts': 317, 'serial_number': '202314071599', }), '202314071660': dict({ 'last_report_date': 1692385995, 'last_report_watts': 310, 'max_report_watts': 322, 'serial_number': '202314071660', }), '202314071753': dict({ 'last_report_date': 1692385996, 'last_report_watts': 276, 'max_report_watts': 337, 'serial_number': '202314071753', }), '202314071845': dict({ 'last_report_date': 1692385846, 'last_report_watts': 308, 'max_report_watts': 324, 'serial_number': '202314071845', }), '202314072420': dict({ 'last_report_date': 1692385967, 'last_report_watts': 305, 'max_report_watts': 321, 'serial_number': '202314072420', }), '202314072546': dict({ 'last_report_date': 1692385844, 'last_report_watts': 307, 'max_report_watts': 319, 'serial_number': '202314072546', }), '202314073012': dict({ 'last_report_date': 1692385787, 'last_report_watts': 308, 'max_report_watts': 323, 'serial_number': '202314073012', }), '202314073205': dict({ 'last_report_date': 1692385938, 'last_report_watts': 304, 'max_report_watts': 321, 'serial_number': '202314073205', }), '202314073251': dict({ 'last_report_date': 1692385937, 'last_report_watts': 307, 'max_report_watts': 323, 'serial_number': '202314073251', }), '202314073257': dict({ 'last_report_date': 1692385907, 'last_report_watts': 309, 'max_report_watts': 322, 'serial_number': '202314073257', }), '202314073428': dict({ 'last_report_date': 1692385942, 'last_report_watts': 311, 'max_report_watts': 324, 'serial_number': '202314073428', }), '202314075069': dict({ 'last_report_date': 1692385999, 'last_report_watts': 308, 'max_report_watts': 319, 'serial_number': '202314075069', }), '202314077078': dict({ 'last_report_date': 1692385935, 'last_report_watts': 302, 'max_report_watts': 317, 'serial_number': '202314077078', }), }), 'raw': dict({ '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1692385844, 'lastReportWatts': 307, 'maxReportWatts': 319, 'serialNumber': '202314072546', }), dict({ 'devType': 1, 'lastReportDate': 1692386025, 'lastReportWatts': 308, 'maxReportWatts': 321, 'serialNumber': '202314071516', }), dict({ 'devType': 1, 'lastReportDate': 1692385784, 'lastReportWatts': 310, 'maxReportWatts': 321, 'serialNumber': '202314058203', }), dict({ 'devType': 1, 'lastReportDate': 1692385785, 'lastReportWatts': 305, 'maxReportWatts': 321, 'serialNumber': '202314060891', }), dict({ 'devType': 1, 'lastReportDate': 1692385786, 'lastReportWatts': 311, 'maxReportWatts': 324, 'serialNumber': '202314068272', }), dict({ 'devType': 1, 'lastReportDate': 1692385935, 'lastReportWatts': 302, 'maxReportWatts': 317, 'serialNumber': '202314077078', }), dict({ 'devType': 1, 'lastReportDate': 1692385935, 'lastReportWatts': 277, 'maxReportWatts': 334, 'serialNumber': '202314065062', }), dict({ 'devType': 1, 'lastReportDate': 1692385787, 'lastReportWatts': 308, 'maxReportWatts': 323, 'serialNumber': '202314073012', }), dict({ 'devType': 1, 'lastReportDate': 1692385936, 'lastReportWatts': 309, 'maxReportWatts': 326, 'serialNumber': '202314070713', }), dict({ 'devType': 1, 'lastReportDate': 1692385846, 'lastReportWatts': 308, 'maxReportWatts': 324, 'serialNumber': '202314071845', }), dict({ 'devType': 1, 'lastReportDate': 1692385847, 'lastReportWatts': 303, 'maxReportWatts': 320, 'serialNumber': '202314069065', }), dict({ 'devType': 1, 'lastReportDate': 1692385904, 'lastReportWatts': 304, 'maxReportWatts': 318, 'serialNumber': '202314068868', }), dict({ 'devType': 1, 'lastReportDate': 1692385965, 'lastReportWatts': 309, 'maxReportWatts': 319, 'serialNumber': '202314066216', }), dict({ 'devType': 1, 'lastReportDate': 1692385937, 'lastReportWatts': 307, 'maxReportWatts': 323, 'serialNumber': '202314073251', }), dict({ 'devType': 1, 'lastReportDate': 1692385938, 'lastReportWatts': 304, 'maxReportWatts': 321, 'serialNumber': '202314073205', }), dict({ 'devType': 1, 'lastReportDate': 1692385966, 'lastReportWatts': 312, 'maxReportWatts': 327, 'serialNumber': '202314050286', }), dict({ 'devType': 1, 'lastReportDate': 1692385967, 'lastReportWatts': 305, 'maxReportWatts': 321, 'serialNumber': '202314072420', }), dict({ 'devType': 1, 'lastReportDate': 1692385907, 'lastReportWatts': 309, 'maxReportWatts': 322, 'serialNumber': '202314073257', }), dict({ 'devType': 1, 'lastReportDate': 1692385939, 'lastReportWatts': 301, 'maxReportWatts': 319, 'serialNumber': '202314070647', }), dict({ 'devType': 1, 'lastReportDate': 1692385995, 'lastReportWatts': 310, 'maxReportWatts': 322, 'serialNumber': '202314071660', }), dict({ 'devType': 1, 'lastReportDate': 1692385968, 'lastReportWatts': 313, 'maxReportWatts': 323, 'serialNumber': '202314069086', }), dict({ 'devType': 1, 'lastReportDate': 1692385969, 'lastReportWatts': 305, 'maxReportWatts': 321, 'serialNumber': '202314055790', }), dict({ 'devType': 1, 'lastReportDate': 1692385996, 'lastReportWatts': 276, 'maxReportWatts': 337, 'serialNumber': '202314071753', }), dict({ 'devType': 1, 'lastReportDate': 1692385997, 'lastReportWatts': 269, 'maxReportWatts': 336, 'serialNumber': '202314061330', }), dict({ 'devType': 1, 'lastReportDate': 1692385942, 'lastReportWatts': 311, 'maxReportWatts': 324, 'serialNumber': '202314073428', }), dict({ 'devType': 1, 'lastReportDate': 1692385969, 'lastReportWatts': 303, 'maxReportWatts': 319, 'serialNumber': '202314065647', }), dict({ 'devType': 1, 'lastReportDate': 1692385971, 'lastReportWatts': 301, 'maxReportWatts': 322, 'serialNumber': '202314062558', }), dict({ 'devType': 1, 'lastReportDate': 1692385971, 'lastReportWatts': 308, 'maxReportWatts': 317, 'serialNumber': '202314070107', }), dict({ 'devType': 1, 'lastReportDate': 1692385973, 'lastReportWatts': 309, 'maxReportWatts': 322, 'serialNumber': '202314059855', }), dict({ 'devType': 1, 'lastReportDate': 1692385998, 'lastReportWatts': 276, 'maxReportWatts': 337, 'serialNumber': '202314063524', }), dict({ 'devType': 1, 'lastReportDate': 1692386026, 'lastReportWatts': 275, 'maxReportWatts': 335, 'serialNumber': '202314062880', }), dict({ 'devType': 1, 'lastReportDate': 1692386027, 'lastReportWatts': 275, 'maxReportWatts': 334, 'serialNumber': '202314070988', }), dict({ 'devType': 1, 'lastReportDate': 1692386029, 'lastReportWatts': 273, 'maxReportWatts': 336, 'serialNumber': '202314065032', }), dict({ 'devType': 1, 'lastReportDate': 1692385974, 'lastReportWatts': 304, 'maxReportWatts': 318, 'serialNumber': '202314062224', }), dict({ 'devType': 1, 'lastReportDate': 1692386029, 'lastReportWatts': 307, 'maxReportWatts': 325, 'serialNumber': '202314064007', }), dict({ 'devType': 1, 'lastReportDate': 1692385977, 'lastReportWatts': 302, 'maxReportWatts': 318, 'serialNumber': '202314067482', }), dict({ 'devType': 1, 'lastReportDate': 1692386030, 'lastReportWatts': 271, 'maxReportWatts': 329, 'serialNumber': '202314070321', }), dict({ 'devType': 1, 'lastReportDate': 1692385978, 'lastReportWatts': 305, 'maxReportWatts': 320, 'serialNumber': '202314070523', }), dict({ 'devType': 1, 'lastReportDate': 1692385978, 'lastReportWatts': 307, 'maxReportWatts': 317, 'serialNumber': '202314071599', }), dict({ 'devType': 1, 'lastReportDate': 1692385979, 'lastReportWatts': 293, 'maxReportWatts': 324, 'serialNumber': '202314068438', }), dict({ 'devType': 1, 'lastReportDate': 1692385814, 'lastReportWatts': 277, 'maxReportWatts': 336, 'serialNumber': '202314069944', }), dict({ 'devType': 1, 'lastReportDate': 1692385999, 'lastReportWatts': 308, 'maxReportWatts': 319, 'serialNumber': '202314075069', }), dict({ 'devType': 1, 'lastReportDate': 1692386032, 'lastReportWatts': 275, 'maxReportWatts': 335, 'serialNumber': '202314070295', }), dict({ 'devType': 1, 'lastReportDate': 1692385980, 'lastReportWatts': 309, 'maxReportWatts': 319, 'serialNumber': '202314069092', }), ]), '/ivp/ensemble/dry_contacts': dict({ 'dry_contacts': list([ dict({ 'id': 'NC1', 'status': 'closed', }), dict({ 'id': 'NC2', 'status': 'closed', }), dict({ 'id': 'NO1', 'status': 'open', }), dict({ 'id': 'NO2', 'status': 'open', }), ]), }), '/ivp/ensemble/inventory': list([ dict({ 'devices': list([ dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '3.8.53', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'created_date': 1691560591, 'dc_switch_off': False, 'der_index': 2, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 4960, 'encharge_rev': 3, 'img_load_date': 1691560591, 'img_pnum_running': '3.0.5949_rel/31.07', 'installed': 1691560591, 'last_rpt_date': 1692385816, 'led_status': 14, 'maxCellTemp': 42, 'part_num': '836-01826-r76', 'percentFull': 100, 'phase': 'ph-a', 'serial_num': '492319002585', 'sleep_enabled': False, 'temperature': 42, }), dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '3.8.53', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'created_date': 1691560590, 'dc_switch_off': False, 'der_index': 2, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 4960, 'encharge_rev': 3, 'img_load_date': 1691560590, 'img_pnum_running': '3.0.5949_rel/31.07', 'installed': 1691560590, 'last_rpt_date': 1692386075, 'led_status': 14, 'maxCellTemp': 42, 'part_num': '836-01826-r76', 'percentFull': 85, 'phase': 'ph-a', 'serial_num': '492319002593', 'sleep_enabled': False, 'temperature': 42, }), ]), 'type': 'ENCHARGE', }), dict({ 'devices': list([ dict({ 'Enchg_grid_mode': 'multimode-ongrid', 'Enpwr_curr_state_id': 16, 'Enpwr_grid_mode': 'multimode-ongrid', 'Enpwr_relay_state_bm': 3568, 'admin_state': 24, 'admin_state_str': 'ENPWR_STATE_OPER_CLOSED', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'created_date': 1691648499, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'img_load_date': 1691648499, 'img_pnum_running': '3.0.5177_rel/31.07', 'installed': 1691648499, 'last_rpt_date': 1692386076, 'mains_admin_state': 'closed', 'mains_oper_state': 'closed', 'part_num': '865-00377-r28', 'serial_num': '482326083757', 'temperature': 113, }), ]), 'type': 'ENPOWER', }), ]), '/ivp/ensemble/power': dict({ 'devices:': list([ dict({ 'apparent_power_mva': 24000, 'real_power_mw': 24000, 'serial_num': '492319002585', 'soc': 100, }), dict({ 'apparent_power_mva': 16000, 'real_power_mw': 16000, 'serial_num': '492319002593', 'soc': 85, }), ]), }), '/ivp/ensemble/secctrl': dict({ 'ACB_agg_energy': 0, 'ACB_agg_soc': 0, 'Commission_in_progress': False, 'ENC_agg_avail_energy': 9176, 'ENC_agg_backup_energy': 2976, 'ENC_agg_soc': 92, 'ENC_agg_soh': 100, 'Enc_commissioned_capacity': 9920, 'Enc_max_available_capacity': 9920, 'Max_energy': 9920, 'Recovery_threshold_soc': 13, 'VLS_Limit': 10, 'adjusted_backup_soc': 30, 'agg_soc': 92, 'configured_backup_soc': 30, 'freq_bias_hz': -1.348230004310608, 'freq_bias_hz_phaseb': 0.0, 'freq_bias_hz_phasec': 0.0, 'freq_bias_hz_q8': -2168, 'freq_bias_hz_q8_phaseb': 0, 'freq_bias_hz_q8_phasec': 0, 'shutdown': False, 'voltage_bias_v': -16.190109252929688, 'voltage_bias_v_phaseb': 0.0, 'voltage_bias_v_phasec': 0.0, 'voltage_bias_v_q5': -518, 'voltage_bias_v_q5_phaseb': 0, 'voltage_bias_v_q5_phasec': 0, }), '/ivp/ss/dry_contact_settings': dict({ 'dry_contacts': list([ dict({ 'black_s_start': 5.0, 'essential_end_time': 82800.0, 'essential_start_time': 21600.0, 'gen_action': 'apply', 'grid_action': 'apply', 'id': 'NC1', 'load_name': 'Furnace', 'manual_override': 'true', 'micro_grid_action': 'apply', 'mode': 'soc', 'override': 'true', 'priority': 1.0, 'pv_serial_nb': list([ ]), 'soc_high': 40.0, 'soc_low': 30.0, 'type': 'LOAD', }), dict({ 'black_s_start': 5.0, 'essential_end_time': 82800.0, 'essential_start_time': 21600.0, 'gen_action': 'apply', 'grid_action': 'apply', 'id': 'NC2', 'load_name': 'AC', 'manual_override': 'true', 'micro_grid_action': 'apply', 'mode': 'soc', 'override': 'true', 'priority': 2.0, 'pv_serial_nb': list([ ]), 'soc_high': 40.0, 'soc_low': 30.0, 'type': 'LOAD', }), dict({ 'black_s_start': 5.0, 'essential_end_time': 82800.0, 'essential_start_time': 21600.0, 'gen_action': 'none', 'grid_action': 'none', 'id': 'NO1', 'load_name': '', 'manual_override': 'true', 'micro_grid_action': 'none', 'mode': 'manual', 'override': 'false', 'priority': 3.0, 'pv_serial_nb': list([ ]), 'soc_high': 40.0, 'soc_low': 30.0, 'type': 'NONE', }), dict({ 'black_s_start': 5.0, 'essential_end_time': 82800.0, 'essential_start_time': 21600.0, 'gen_action': 'none', 'grid_action': 'none', 'id': 'NO2', 'load_name': '', 'manual_override': 'true', 'micro_grid_action': 'none', 'mode': 'manual', 'override': 'false', 'priority': 4.0, 'pv_serial_nb': list([ ]), 'soc_high': 40.0, 'soc_low': 30.0, 'type': 'NONE', }), ]), }), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 1, 'apprntPwr': 5007.246, 'measurementType': 'total-consumption', 'pwrFactor': 1.0, 'reactPwr': 1407.058, 'readingTime': 1692386083, 'rmsCurrent': 40.571, 'rmsVoltage': 246.894, 'type': 'eim', 'vahLifetime': 1607135.036, 'vahToday': 1190799.036, 'varhLagLifetime': 29677.693, 'varhLagToday': 17206.693, 'varhLeadLifetime': 108784.489, 'varhLeadToday': 104827.489, 'wNow': 5216.083, 'whLastSevenDays': 0.0, 'whLifetime': 1757943.133, 'whToday': 0.0, }), dict({ 'activeCount': 1, 'apprntPwr': -8358.792, 'measurementType': 'net-consumption', 'pwrFactor': -1.0, 'reactPwr': 1329.256, 'readingTime': 1692386083, 'rmsCurrent': -67.703, 'rmsVoltage': 246.894, 'type': 'eim', 'vahLifetime': 1607135.036, 'vahToday': 0, 'varhLagLifetime': 234428.764, 'varhLagToday': 0, 'varhLeadLifetime': 109642.368, 'varhLeadToday': 0, 'wNow': -7812.457, 'whLastSevenDays': 0, 'whLifetime': 247929.658, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 44, 'readingTime': 1692386032, 'type': 'inverters', 'wNow': 13163, 'whLifetime': 348363, }), dict({ 'activeCount': 1, 'apprntPwr': 13367.009, 'measurementType': 'production', 'pwrFactor': 0.97, 'reactPwr': 77.802, 'readingTime': 1692386083, 'rmsCurrent': 108.274, 'rmsVoltage': 246.894, 'type': 'eim', 'vahLifetime': 1746683.744, 'vahToday': 64277.744, 'varhLagLifetime': 204751.071, 'varhLagToday': 8551.071, 'varhLeadLifetime': 857.879, 'varhLeadToday': 33.879, 'wNow': 13028.54, 'whLastSevenDays': 1456156.655, 'whLifetime': 1510198.655, 'whToday': 55037.655, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': dict({ 'watt_hours_last_7_days': 0, 'watt_hours_lifetime': 1757943, 'watt_hours_today': 0, 'watts_now': 5216, }), 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 1456157, 'watt_hours_lifetime': 1510199, 'watt_hours_today': 55038, 'watts_now': 13029, }), 'system_production_phases': None, 'tariff': None, }) # --- # name: test_with_7_x_firmware[8.2.127_with_3cts_and_battery_split] dict({ 'ctmeter_consumption': dict({ 'active_power': 129, 'current': 21.241, 'eid': 704643584, 'energy_delivered': 4998252, 'energy_received': 253961, 'frequency': 60.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': 0.034, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1709829517, 'voltage': 242.553, }), 'ctmeter_consumption_phases': dict({ : dict({ 'active_power': -201, 'current': 9.316, 'eid': 1778385425, 'energy_delivered': 2631217, 'energy_received': 93777, 'frequency': 60.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': -0.193, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1709829517, 'voltage': 121.334, }), : dict({ 'active_power': 331, 'current': 11.925, 'eid': 1778385426, 'energy_delivered': 2367035, 'energy_received': 160184, 'frequency': 60.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': 0.212, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1709829517, 'voltage': 121.219, }), }), 'ctmeter_production': dict({ 'active_power': 1714, 'current': 17.326, 'eid': 704643328, 'energy_delivered': 3165834, 'energy_received': 76, 'frequency': 60.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.817, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1709829517, 'voltage': 242.367, }), 'ctmeter_production_phases': dict({ : dict({ 'active_power': 856, 'current': 8.658, 'eid': 1778385169, 'energy_delivered': 1581746, 'energy_received': 46, 'frequency': 60.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.822, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1709829517, 'voltage': 121.224, }), : dict({ 'active_power': 858, 'current': 8.668, 'eid': 1778385170, 'energy_delivered': 1584088, 'energy_received': 30, 'frequency': 60.0, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.812, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1709829517, 'voltage': 121.143, }), }), 'ctmeter_storage': dict({ 'active_power': -2580, 'current': 14.575, 'eid': 704643840, 'energy_delivered': 2274359, 'energy_received': 2971414, 'frequency': 60.0, 'measurement_type': 'storage', 'metering_status': 'normal', 'power_factor': -1.0, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1709829517, 'voltage': 242.582, }), 'ctmeter_storage_phases': dict({ : dict({ 'active_power': -2115, 'current': 9.316, 'eid': 1778385681, 'energy_delivered': 1136860, 'energy_received': 1485292, 'frequency': 60.0, 'measurement_type': 'storage', 'metering_status': 'normal', 'power_factor': -0.193, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1709829517, 'voltage': 121.334, }), : dict({ 'active_power': -465, 'current': 5.259, 'eid': 1778385682, 'energy_delivered': 1137499, 'energy_received': 1486122, 'frequency': 60.0, 'measurement_type': 'storage', 'metering_status': 'normal', 'power_factor': -0.713, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1709829517, 'voltage': 121.248, }), }), 'dry_contact_settings': dict({ 'NC1': dict({ 'black_start': 5, 'essential_end_time': 57600, 'essential_start_time': 32400, 'generator_action': , 'grid_action': , 'id': 'NC1', 'load_name': '', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': False, 'priority': 1, 'pv_serial_nb': list([ ]), 'soc_high': 40, 'soc_low': 30, 'type': , }), 'NC2': dict({ 'black_start': 5, 'essential_end_time': 57600, 'essential_start_time': 32400, 'generator_action': , 'grid_action': , 'id': 'NC2', 'load_name': '', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': False, 'priority': 2, 'pv_serial_nb': list([ ]), 'soc_high': 40, 'soc_low': 30, 'type': , }), 'NO1': dict({ 'black_start': 5, 'essential_end_time': 57600, 'essential_start_time': 32400, 'generator_action': , 'grid_action': , 'id': 'NO1', 'load_name': '', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': False, 'priority': 3, 'pv_serial_nb': list([ ]), 'soc_high': 40, 'soc_low': 30, 'type': , }), 'NO2': dict({ 'black_start': 5, 'essential_end_time': 57600, 'essential_start_time': 32400, 'generator_action': , 'grid_action': , 'id': 'NO2', 'load_name': '', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': False, 'priority': 4, 'pv_serial_nb': list([ ]), 'soc_high': 40, 'soc_low': 30, 'type': , }), }), 'dry_contact_status': dict({ 'NC1': dict({ 'id': 'NC1', 'status': , }), 'NC2': dict({ 'id': 'NC2', 'status': , }), 'NO1': dict({ 'id': 'NO1', 'status': , }), 'NO2': dict({ 'id': 'NO2', 'status': , }), }), 'encharge_aggregate': dict({ 'available_energy': 5250, 'backup_reserve': 5000, 'configured_reserve_state_of_charge': 20, 'max_available_capacity': 25000, 'reserve_state_of_charge': 20, 'state_of_charge': 21, }), 'encharge_inventory': dict({ '12345678901002': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '3.8.63', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 5000, 'encharge_revision': 3, 'firmware_loaded_date': 1707197622, 'firmware_version': '3.0.6614_rel/31.13', 'installed_date': 1707197622, 'last_report_date': 1709829328, 'led_status': 12, 'max_cell_temp': 13, 'operating': None, 'part_number': '836-01826-r81', 'percent_full': 21, 'serial_number': '12345678901002', 'temperature': 13, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': None, }), '12345678901003': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '3.8.63', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 5000, 'encharge_revision': 3, 'firmware_loaded_date': 1706749292, 'firmware_version': '3.0.6614_rel/31.13', 'installed_date': 1706749292, 'last_report_date': 1709829288, 'led_status': 12, 'max_cell_temp': 12, 'operating': None, 'part_number': '836-01826-r76', 'percent_full': 21, 'serial_number': '12345678901003', 'temperature': 12, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': None, }), '12345678901004': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '3.8.63', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 5000, 'encharge_revision': 3, 'firmware_loaded_date': 1707622567, 'firmware_version': '3.0.6614_rel/31.13', 'installed_date': 1707622567, 'last_report_date': 1709829437, 'led_status': 12, 'max_cell_temp': 12, 'operating': None, 'part_number': '836-01826-r76', 'percent_full': 21, 'serial_number': '12345678901004', 'temperature': 12, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': None, }), '12345678901005': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '3.8.63', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 5000, 'encharge_revision': 3, 'firmware_loaded_date': 1709410199, 'firmware_version': '3.0.6614_rel/31.13', 'installed_date': 1709410199, 'last_report_date': 1709829256, 'led_status': 12, 'max_cell_temp': 12, 'operating': None, 'part_number': '836-01826-r76', 'percent_full': 21, 'serial_number': '12345678901005', 'temperature': 11, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': None, }), '12345678901006': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '3.8.63', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 5000, 'encharge_revision': 3, 'firmware_loaded_date': 1709749530, 'firmware_version': '3.0.6614_rel/31.13', 'installed_date': 1709749530, 'last_report_date': 1709829434, 'led_status': 12, 'max_cell_temp': 12, 'operating': None, 'part_number': '836-01826-r76', 'percent_full': 21, 'serial_number': '12345678901006', 'temperature': 12, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': None, }), }), 'encharge_power': dict({ '12345678901002': dict({ 'apparent_power_mva': -121000, 'real_power_mw': -121000, 'soc': 21, }), '12345678901003': dict({ 'apparent_power_mva': -128000, 'real_power_mw': -128000, 'soc': 21, }), '12345678901004': dict({ 'apparent_power_mva': -128000, 'real_power_mw': -128000, 'soc': 21, }), '12345678901005': dict({ 'apparent_power_mva': -128000, 'real_power_mw': -128000, 'soc': 21, }), '12345678901006': dict({ 'apparent_power_mva': -136000, 'real_power_mw': -136000, 'soc': 21, }), }), 'enpower': dict({ 'admin_state': 24, 'admin_state_str': 'ENPWR_STATE_OPER_CLOSED', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'firmware_loaded_date': 1709657837, 'firmware_version': '3.0.5654_rel/31.13', 'grid_mode': 'multimode-ongrid', 'installed_date': 1709657837, 'last_report_date': 1709829514, 'mains_admin_state': 'closed', 'mains_oper_state': 'closed', 'operating': None, 'part_number': '865-00378-r27', 'serial_number': '12345678901001', 'temperature': 72, 'temperature_unit': 'F', 'zigbee_dongle_fw_version': None, }), 'inverters': dict({ '482243033093': dict({ 'last_report_date': 1695752940, 'last_report_watts': 0, 'max_report_watts': 362, 'serial_number': '482243033093', }), '482243033113': dict({ 'last_report_date': 1695752919, 'last_report_watts': 0, 'max_report_watts': 361, 'serial_number': '482243033113', }), '482246043645': dict({ 'last_report_date': 1695752947, 'last_report_watts': 0, 'max_report_watts': 361, 'serial_number': '482246043645', }), '482246047675': dict({ 'last_report_date': 1695752865, 'last_report_watts': 0, 'max_report_watts': 361, 'serial_number': '482246047675', }), '482246047880': dict({ 'last_report_date': 1695752936, 'last_report_watts': 0, 'max_report_watts': 360, 'serial_number': '482246047880', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'batt_mode': 'self-consumption', 'battery_mode': 'self-consumption', 'charge_from_grid': False, 'date': '2024-03-06 22:58:46 UTC', 'filename': 'Tariff', 'operation_mode_sub_type': 'prioritize-energy', 'override': False, 'override_backup_soc': 30, 'override_chg_dischg_rate': 0, 'override_tou_mode': 'StorageTouMode_DEFAULT_TOU_MODE', 'reserved_soc': 20, 'schedule': dict({ 'Disable': list([ dict({ 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), ]), 'tariff': list([ dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'end': '10/1', 'start': '6/1', }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'end': '6/1', 'start': '10/1', }), ]), }), 'source': 'Tariff', 'version': '00.00.02', 'very_low_soc': 10, }), 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': '1709367413', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri', 'enable_discharge_to_grid': False, 'id': 'weekdays', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'peak_rule': 'DL', 'periods': list([ dict({ 'id': 'filler', 'rate': 0.321370005607605, 'start': 0, }), dict({ 'id': 'period_2', 'rate': 0.5212500095367432, 'start': 900, }), dict({ 'id': 'period_1', 'rate': 0.6300299763679504, 'start': 960, }), dict({ 'id': 'period_3', 'rate': 0.5212500095367432, 'start': 1260, }), dict({ 'id': 'filler', 'rate': 0.321370005607605, 'start': 1439, }), ]), }), dict({ 'days': 'Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'weekend', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'peak_rule': 'DL', 'periods': list([ dict({ 'id': 'filler', 'rate': 0.321370005607605, 'start': 0, }), dict({ 'id': 'period_2', 'rate': 0.5212500095367432, 'start': 900, }), dict({ 'id': 'period_1', 'rate': 0.6300299763679504, 'start': 960, }), dict({ 'id': 'period_3', 'rate': 0.5212500095367432, 'start': 1260, }), dict({ 'id': 'filler', 'rate': 0.321370005607605, 'start': 1439, }), ]), }), ]), 'id': 'summer', 'start': '6/1', 'tiers': list([ ]), }), dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri', 'enable_discharge_to_grid': False, 'id': 'weekdays', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'peak_rule': 'DL', 'periods': list([ dict({ 'id': 'filler', 'rate': 0.3213590085506439, 'start': 0, }), dict({ 'id': 'period_2', 'rate': 0.4895789921283722, 'start': 900, }), dict({ 'id': 'period_1', 'rate': 0.5047900080680847, 'start': 960, }), dict({ 'id': 'period_3', 'rate': 0.4895789921283722, 'start': 1260, }), dict({ 'id': 'filler', 'rate': 0.3213590085506439, 'start': 1439, }), ]), }), dict({ 'days': 'Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'weekend', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'peak_rule': 'DL', 'periods': list([ dict({ 'id': 'filler', 'rate': 0.3213590085506439, 'start': 0, }), dict({ 'id': 'period_2', 'rate': 0.4895789921283722, 'start': 900, }), dict({ 'id': 'period_1', 'rate': 0.5047900080680847, 'start': 960, }), dict({ 'id': 'period_3', 'rate': 0.4895789921283722, 'start': 1260, }), dict({ 'id': 'filler', 'rate': 0.3213590085506439, 'start': 1439, }), ]), }), ]), 'id': 'winter', 'start': '10/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.321370005607605, 'sell': 9.899999713525176e-05, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1709339757', 'mode': 'self-consumption', 'operation_mode_sub_type': 'prioritize-energy', 'reserved_soc': 20, 'very_low_soc': 10, }), }), }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1695752919, 'lastReportWatts': 0, 'maxReportWatts': 361, 'serialNumber': '482243033113', }), dict({ 'devType': 1, 'lastReportDate': 1695752947, 'lastReportWatts': 0, 'maxReportWatts': 361, 'serialNumber': '482246043645', }), dict({ 'devType': 1, 'lastReportDate': 1695752865, 'lastReportWatts': 0, 'maxReportWatts': 361, 'serialNumber': '482246047675', }), dict({ 'devType': 1, 'lastReportDate': 1695752936, 'lastReportWatts': 0, 'maxReportWatts': 360, 'serialNumber': '482246047880', }), dict({ 'devType': 1, 'lastReportDate': 1695752940, 'lastReportWatts': 0, 'maxReportWatts': 362, 'serialNumber': '482243033093', }), ]), '/ivp/ensemble/dry_contacts': dict({ 'dry_contacts': list([ dict({ 'id': 'NC1', 'status': 'closed', }), dict({ 'id': 'NC2', 'status': 'closed', }), dict({ 'id': 'NO1', 'status': 'closed', }), dict({ 'id': 'NO2', 'status': 'closed', }), ]), }), '/ivp/ensemble/inventory': list([ dict({ 'devices': list([ dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '3.8.63', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'created_date': 1709749530, 'dc_switch_off': False, 'der_index': 2, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 5000, 'encharge_rev': 3, 'img_load_date': 1709749530, 'img_pnum_running': '3.0.6614_rel/31.13', 'installed': 1709749530, 'last_rpt_date': 1709829434, 'led_status': 12, 'maxCellTemp': 12, 'part_num': '836-01826-r76', 'percentFull': 21, 'phase': 'ph-a', 'reported_enc_grid_state': 'grid-tied', 'serial_num': '12345678901006', 'sleep_enabled': False, 'temperature': 12, }), dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '3.8.63', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'created_date': 1709410199, 'dc_switch_off': False, 'der_index': 2, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 5000, 'encharge_rev': 3, 'img_load_date': 1709410199, 'img_pnum_running': '3.0.6614_rel/31.13', 'installed': 1709410199, 'last_rpt_date': 1709829256, 'led_status': 12, 'maxCellTemp': 12, 'part_num': '836-01826-r76', 'percentFull': 21, 'phase': 'ph-a', 'reported_enc_grid_state': 'grid-tied', 'serial_num': '12345678901005', 'sleep_enabled': False, 'temperature': 11, }), dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '3.8.63', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'created_date': 1707622567, 'dc_switch_off': False, 'der_index': 2, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 5000, 'encharge_rev': 3, 'img_load_date': 1707622567, 'img_pnum_running': '3.0.6614_rel/31.13', 'installed': 1707622567, 'last_rpt_date': 1709829437, 'led_status': 12, 'maxCellTemp': 12, 'part_num': '836-01826-r76', 'percentFull': 21, 'phase': 'ph-a', 'reported_enc_grid_state': 'grid-tied', 'serial_num': '12345678901004', 'sleep_enabled': False, 'temperature': 12, }), dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '3.8.63', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'created_date': 1706749292, 'dc_switch_off': False, 'der_index': 2, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 5000, 'encharge_rev': 3, 'img_load_date': 1706749292, 'img_pnum_running': '3.0.6614_rel/31.13', 'installed': 1706749292, 'last_rpt_date': 1709829288, 'led_status': 12, 'maxCellTemp': 12, 'part_num': '836-01826-r76', 'percentFull': 21, 'phase': 'ph-a', 'reported_enc_grid_state': 'grid-tied', 'serial_num': '12345678901003', 'sleep_enabled': False, 'temperature': 12, }), dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '3.8.63', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'created_date': 1707197622, 'dc_switch_off': False, 'der_index': 3, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 5000, 'encharge_rev': 3, 'img_load_date': 1707197622, 'img_pnum_running': '3.0.6614_rel/31.13', 'installed': 1707197622, 'last_rpt_date': 1709829328, 'led_status': 12, 'maxCellTemp': 13, 'part_num': '836-01826-r81', 'percentFull': 21, 'phase': 'ph-a', 'reported_enc_grid_state': 'grid-tied', 'serial_num': '12345678901002', 'sleep_enabled': False, 'temperature': 13, }), ]), 'type': 'ENCHARGE', }), dict({ 'devices': list([ dict({ 'Enchg_grid_mode': 'multimode-ongrid', 'Enpwr_curr_state_id': 16, 'Enpwr_grid_mode': 'multimode-ongrid', 'Enpwr_relay_state_bm': 15868, 'admin_state': 24, 'admin_state_str': 'ENPWR_STATE_OPER_CLOSED', 'comm_level_2_4_ghz': 0, 'comm_level_sub_ghz': 0, 'communicating': True, 'created_date': 1709657837, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'img_load_date': 1709657837, 'img_pnum_running': '3.0.5654_rel/31.13', 'installed': 1709657837, 'last_rpt_date': 1709829514, 'mains_admin_state': 'closed', 'mains_oper_state': 'closed', 'part_num': '865-00378-r27', 'serial_num': '12345678901001', 'temperature': 72, }), ]), 'type': 'ENPOWER', }), ]), '/ivp/ensemble/power': dict({ 'devices:': list([ dict({ 'apparent_power_mva': -136000, 'real_power_mw': -136000, 'serial_num': '12345678901006', 'soc': 21, }), dict({ 'apparent_power_mva': -128000, 'real_power_mw': -128000, 'serial_num': '12345678901005', 'soc': 21, }), dict({ 'apparent_power_mva': -128000, 'real_power_mw': -128000, 'serial_num': '12345678901004', 'soc': 21, }), dict({ 'apparent_power_mva': -128000, 'real_power_mw': -128000, 'serial_num': '12345678901003', 'soc': 21, }), dict({ 'apparent_power_mva': -121000, 'real_power_mw': -121000, 'serial_num': '12345678901002', 'soc': 21, }), ]), }), '/ivp/ensemble/secctrl': dict({ 'ACB_agg_energy': 0, 'ACB_agg_soc': 0, 'Commission_in_progress': False, 'ENC_agg_avail_energy': 5250, 'ENC_agg_backup_energy': 5000, 'ENC_agg_soc': 21, 'ENC_agg_soh': 100, 'ESS_in_progress': False, 'Enc_commissioned_capacity': 25000, 'Enc_max_available_capacity': 25000, 'Max_energy': 25000, 'VLS_Limit': 10, 'adjusted_backup_soc': 20, 'agg_soc': 21, 'configured_backup_soc': 20, 'freq_bias_hz': -0.06000090762972832, 'freq_bias_hz_phaseb': 0.0, 'freq_bias_hz_phasec': 0.0, 'freq_bias_hz_q8': -96, 'freq_bias_hz_q8_phaseb': 0, 'freq_bias_hz_q8_phasec': 0, 'shutdown': False, 'soc_rec_enabled': False, 'soc_recovery_entry': 2, 'soc_recovery_exit': 10, 'voltage_bias_v': -0.7205159664154053, 'voltage_bias_v_phaseb': 0.0, 'voltage_bias_v_phasec': 0.0, 'voltage_bias_v_q5': -23, 'voltage_bias_v_q5_phaseb': 0, 'voltage_bias_v_q5_phasec': 0, }), '/ivp/meters': list([ dict({ 'eid': 704643328, 'measurementType': 'production', 'meteringStatus': 'normal', 'phaseCount': 2, 'phaseMode': 'split', 'state': 'enabled', 'statusFlags': list([ ]), }), dict({ 'eid': 704643584, 'measurementType': 'net-consumption', 'meteringStatus': 'normal', 'phaseCount': 2, 'phaseMode': 'split', 'state': 'enabled', 'statusFlags': list([ ]), }), dict({ 'eid': 704643840, 'measurementType': 'storage', 'meteringStatus': 'normal', 'phaseCount': 2, 'phaseMode': 'split', 'state': 'enabled', 'statusFlags': list([ ]), }), ]), '/ivp/meters/readings': list([ dict({ 'actEnergyDlvd': 3165834.272, 'actEnergyRcvd': 75.689, 'activePower': 1714.424, 'apparentEnergy': 5529628.28, 'apparentPower': 2100.04, 'channels': list([ dict({ 'actEnergyDlvd': 1581746.293, 'actEnergyRcvd': 45.89, 'activePower': 856.031, 'apparentEnergy': 2763520.42, 'apparentPower': 1049.732, 'current': 8.658, 'eid': 1778385169, 'freq': 60.0, 'instantaneousDemand': 856.031, 'pwrFactor': 0.822, 'reactEnergyLagg': 803725.479, 'reactEnergyLead': 33935.538, 'reactivePower': 8.366, 'timestamp': 1709829517, 'voltage': 121.224, }), dict({ 'actEnergyDlvd': 1584087.979, 'actEnergyRcvd': 29.799, 'activePower': 858.394, 'apparentEnergy': 2766107.86, 'apparentPower': 1050.307, 'current': 8.668, 'eid': 1778385170, 'freq': 60.0, 'instantaneousDemand': 858.394, 'pwrFactor': 0.812, 'reactEnergyLagg': 803599.733, 'reactEnergyLead': 34616.443, 'reactivePower': 12.499, 'timestamp': 1709829517, 'voltage': 121.143, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 0.0, 'activePower': 0.0, 'apparentEnergy': 0.0, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385171, 'freq': 60.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 0.0, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1709829517, 'voltage': 0.0, }), ]), 'current': 17.326, 'eid': 704643328, 'freq': 60.0, 'instantaneousDemand': 1714.424, 'pwrFactor': 0.817, 'reactEnergyLagg': 1607325.212, 'reactEnergyLead': 68551.981, 'reactivePower': 20.865, 'timestamp': 1709829517, 'voltage': 242.367, }), dict({ 'actEnergyDlvd': 4998251.825, 'actEnergyRcvd': 253960.783, 'activePower': 129.407, 'apparentEnergy': 12810156.532, 'apparentPower': 2578.068, 'channels': list([ dict({ 'actEnergyDlvd': 2631217.196, 'actEnergyRcvd': 93777.056, 'activePower': -201.39, 'apparentEnergy': 6787276.689, 'apparentPower': 1130.056, 'current': 9.316, 'eid': 1778385425, 'freq': 60.0, 'instantaneousDemand': -201.39, 'pwrFactor': -0.193, 'reactEnergyLagg': 79.572, 'reactEnergyLead': 5042497.945, 'reactivePower': -935.571, 'timestamp': 1709829517, 'voltage': 121.334, }), dict({ 'actEnergyDlvd': 2367034.629, 'actEnergyRcvd': 160183.727, 'activePower': 330.797, 'apparentEnergy': 6022879.843, 'apparentPower': 1448.012, 'current': 11.925, 'eid': 1778385426, 'freq': 60.0, 'instantaneousDemand': 330.797, 'pwrFactor': 0.212, 'reactEnergyLagg': 105.465, 'reactEnergyLead': 4128101.723, 'reactivePower': -1295.012, 'timestamp': 1709829517, 'voltage': 121.219, }), dict({ 'actEnergyDlvd': 1137498.944, 'actEnergyRcvd': 1486121.902, 'activePower': -464.966, 'apparentEnergy': 3935472.955, 'apparentPower': 640.741, 'current': 5.259, 'eid': 1778385427, 'freq': 60.0, 'instantaneousDemand': -464.966, 'pwrFactor': -0.713, 'reactEnergyLagg': 1355134.893, 'reactEnergyLead': 31326.355, 'reactivePower': 377.197, 'timestamp': 1709829517, 'voltage': 121.248, }), ]), 'current': 21.241, 'eid': 704643584, 'freq': 60.0, 'instantaneousDemand': 129.407, 'pwrFactor': 0.034, 'reactEnergyLagg': 185.037, 'reactEnergyLead': 9170599.668, 'reactivePower': -2230.583, 'timestamp': 1709829517, 'voltage': 242.553, }), dict({ 'actEnergyDlvd': 2274358.602, 'actEnergyRcvd': 2971414.344, 'activePower': -2579.823, 'apparentEnergy': 7881024.906, 'apparentPower': 461.253, 'channels': list([ dict({ 'actEnergyDlvd': 1136859.658, 'actEnergyRcvd': 1485292.441, 'activePower': -2114.856, 'apparentEnergy': 3945551.951, 'apparentPower': -179.488, 'current': 9.316, 'eid': 1778385681, 'freq': 60.0, 'instantaneousDemand': -2114.856, 'pwrFactor': -0.193, 'reactEnergyLagg': 1358495.518, 'reactEnergyLead': 31391.267, 'reactivePower': 299.583, 'timestamp': 1709829517, 'voltage': 121.334, }), dict({ 'actEnergyDlvd': 1137498.944, 'actEnergyRcvd': 1486121.902, 'activePower': -464.966, 'apparentEnergy': 3935472.955, 'apparentPower': 640.741, 'current': 5.259, 'eid': 1778385682, 'freq': 60.0, 'instantaneousDemand': -464.966, 'pwrFactor': -0.713, 'reactEnergyLagg': 1355134.893, 'reactEnergyLead': 31326.355, 'reactivePower': 377.197, 'timestamp': 1709829517, 'voltage': 121.248, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 0.0, 'activePower': 0.0, 'apparentEnergy': 0.0, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385683, 'freq': 0.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 0.0, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1709829517, 'voltage': 0.0, }), ]), 'current': 14.575, 'eid': 704643840, 'freq': 60.0, 'instantaneousDemand': -2579.823, 'pwrFactor': -1.0, 'reactEnergyLagg': 2713630.41, 'reactEnergyLead': 62717.621, 'reactivePower': 676.781, 'timestamp': 1709829517, 'voltage': 242.582, }), ]), '/ivp/ss/dry_contact_settings': dict({ 'dry_contacts': list([ dict({ 'black_s_start': 5, 'essential_end_time': 57600, 'essential_start_time': 32400, 'gen_action': 'none', 'grid_action': 'none', 'id': 'NC1', 'load_name': '', 'manual_override': 'true', 'micro_grid_action': 'none', 'mode': 'manual', 'override': 'false', 'priority': 1, 'pv_serial_nb': list([ ]), 'soc_high': 40, 'soc_low': 30, 'type': 'NONE', }), dict({ 'black_s_start': 5, 'essential_end_time': 57600, 'essential_start_time': 32400, 'gen_action': 'none', 'grid_action': 'none', 'id': 'NC2', 'load_name': '', 'manual_override': 'true', 'micro_grid_action': 'none', 'mode': 'manual', 'override': 'false', 'priority': 2, 'pv_serial_nb': list([ ]), 'soc_high': 40, 'soc_low': 30, 'type': 'NONE', }), dict({ 'black_s_start': 5, 'essential_end_time': 57600, 'essential_start_time': 32400, 'gen_action': 'none', 'grid_action': 'none', 'id': 'NO1', 'load_name': '', 'manual_override': 'true', 'micro_grid_action': 'none', 'mode': 'manual', 'override': 'false', 'priority': 3, 'pv_serial_nb': list([ ]), 'soc_high': 40, 'soc_low': 30, 'type': 'NONE', }), dict({ 'black_s_start': 5, 'essential_end_time': 57600, 'essential_start_time': 32400, 'gen_action': 'none', 'grid_action': 'none', 'id': 'NO2', 'load_name': '', 'manual_override': 'true', 'micro_grid_action': 'none', 'mode': 'manual', 'override': 'false', 'priority': 4, 'pv_serial_nb': list([ ]), 'soc_high': 40, 'soc_low': 30, 'type': 'NONE', }), ]), }), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 1, 'apprntPwr': 2416.339, 'measurementType': 'total-consumption', 'pwrFactor': 0.75, 'reactPwr': -2209.719, 'readingTime': 1709829518, 'rmsCurrent': 19.934, 'rmsVoltage': 242.553, 'type': 'eim', 'vahLifetime': 12810156.532, 'vahToday': 4946716.532, 'varhLagLifetime': -1607140.175, 'varhLagToday': 9360.0, 'varhLeadLifetime': 9102047.686, 'varhLeadToday': 9039334.686, 'wNow': 1843.831, 'whLastSevenDays': 0.0, 'whLifetime': 7909866.491, 'whToday': 7596.0, }), dict({ 'activeCount': 1, 'apprntPwr': 315.151, 'measurementType': 'net-consumption', 'pwrFactor': 0.28, 'reactPwr': -2230.583, 'readingTime': 1709829518, 'rmsCurrent': 2.609, 'rmsVoltage': 242.553, 'type': 'eim', 'vahLifetime': 12810156.532, 'vahToday': 0, 'varhLagLifetime': 185.037, 'varhLagToday': 0, 'varhLeadLifetime': 9170599.668, 'varhLeadToday': 0, 'wNow': 129.407, 'whLastSevenDays': 0, 'whLifetime': 4744549.864, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 35, 'readingTime': 1709829490, 'type': 'inverters', 'wNow': 1592, 'whLifetime': 821819, }), dict({ 'activeCount': 1, 'apprntPwr': 2100.04, 'measurementType': 'production', 'pwrFactor': 0.82, 'reactPwr': 20.865, 'readingTime': 1709829518, 'rmsCurrent': 17.326, 'rmsVoltage': 242.367, 'type': 'eim', 'vahLifetime': 5529628.28, 'vahToday': 8010.28, 'varhLagLifetime': 1607325.212, 'varhLagToday': 5202.212, 'varhLeadLifetime': 68551.981, 'varhLeadToday': 0.981, 'wNow': 1714.424, 'whLastSevenDays': 3164458.272, 'whLifetime': 3165834.272, 'whToday': 1475.272, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': dict({ 'watt_hours_last_7_days': 0, 'watt_hours_lifetime': 7909866, 'watt_hours_today': 7596, 'watts_now': 1844, }), 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 3164458, 'watt_hours_lifetime': 3165834, 'watt_hours_today': 1475, 'watts_now': 1714, }), 'system_production_phases': None, 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': '1709367413', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri', 'enable_discharge_to_grid': False, 'id': 'weekdays', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'peak_rule': 'DL', 'periods': list([ dict({ 'id': 'filler', 'rate': 0.321370005607605, 'start': 0, }), dict({ 'id': 'period_2', 'rate': 0.5212500095367432, 'start': 900, }), dict({ 'id': 'period_1', 'rate': 0.6300299763679504, 'start': 960, }), dict({ 'id': 'period_3', 'rate': 0.5212500095367432, 'start': 1260, }), dict({ 'id': 'filler', 'rate': 0.321370005607605, 'start': 1439, }), ]), }), dict({ 'days': 'Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'weekend', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'peak_rule': 'DL', 'periods': list([ dict({ 'id': 'filler', 'rate': 0.321370005607605, 'start': 0, }), dict({ 'id': 'period_2', 'rate': 0.5212500095367432, 'start': 900, }), dict({ 'id': 'period_1', 'rate': 0.6300299763679504, 'start': 960, }), dict({ 'id': 'period_3', 'rate': 0.5212500095367432, 'start': 1260, }), dict({ 'id': 'filler', 'rate': 0.321370005607605, 'start': 1439, }), ]), }), ]), 'id': 'summer', 'start': '6/1', 'tiers': list([ ]), }), dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri', 'enable_discharge_to_grid': False, 'id': 'weekdays', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'peak_rule': 'DL', 'periods': list([ dict({ 'id': 'filler', 'rate': 0.3213590085506439, 'start': 0, }), dict({ 'id': 'period_2', 'rate': 0.4895789921283722, 'start': 900, }), dict({ 'id': 'period_1', 'rate': 0.5047900080680847, 'start': 960, }), dict({ 'id': 'period_3', 'rate': 0.4895789921283722, 'start': 1260, }), dict({ 'id': 'filler', 'rate': 0.3213590085506439, 'start': 1439, }), ]), }), dict({ 'days': 'Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'weekend', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'peak_rule': 'DL', 'periods': list([ dict({ 'id': 'filler', 'rate': 0.3213590085506439, 'start': 0, }), dict({ 'id': 'period_2', 'rate': 0.4895789921283722, 'start': 900, }), dict({ 'id': 'period_1', 'rate': 0.5047900080680847, 'start': 960, }), dict({ 'id': 'period_3', 'rate': 0.4895789921283722, 'start': 1260, }), dict({ 'id': 'filler', 'rate': 0.3213590085506439, 'start': 1439, }), ]), }), ]), 'id': 'winter', 'start': '10/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0.321370005607605, 'sell': 9.899999713525176e-05, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1709339757', 'mode': , 'operation_mode_sub_type': 'prioritize-energy', 'reserved_soc': 20, 'very_low_soc': 10, }), }), }) # --- # name: test_with_7_x_firmware[8.2.127_with_generator_running] dict({ 'ctmeter_consumption': dict({ 'active_power': 196, 'current': 9.098, 'eid': 704643584, 'energy_delivered': 13632727, 'energy_received': 6336017, 'frequency': 60.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': 0.398, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1718213332, 'voltage': 243.047, }), 'ctmeter_consumption_phases': dict({ : dict({ 'active_power': 268, 'current': 4.859, 'eid': 1778385425, 'energy_delivered': 7037859, 'energy_received': 2542489, 'frequency': 60.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': 0.637, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1718213332, 'voltage': 121.856, }), : dict({ 'active_power': -72, 'current': 4.239, 'eid': 1778385426, 'energy_delivered': 6594868, 'energy_received': 3793528, 'frequency': 60.0, 'measurement_type': 'net-consumption', 'metering_status': 'normal', 'power_factor': 0.081, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1718213332, 'voltage': 121.192, }), }), 'ctmeter_production': dict({ 'active_power': 2336, 'current': 21.222, 'eid': 704643328, 'energy_delivered': 15097305, 'energy_received': 15, 'frequency': 60.062, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.88, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1718213332, 'voltage': 242.887, }), 'ctmeter_production_phases': dict({ : dict({ 'active_power': 1173, 'current': 10.607, 'eid': 1778385169, 'energy_delivered': 7551632, 'energy_received': 8, 'frequency': 60.062, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.883, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1718213332, 'voltage': 121.774, }), : dict({ 'active_power': 1163, 'current': 10.615, 'eid': 1778385170, 'energy_delivered': 7545672, 'energy_received': 8, 'frequency': 60.062, 'measurement_type': 'production', 'metering_status': 'normal', 'power_factor': 0.877, 'state': 'enabled', 'status_flags': list([ ]), 'timestamp': 1718213332, 'voltage': 121.113, }), }), 'ctmeter_storage': None, 'ctmeter_storage_phases': None, 'dry_contact_settings': dict({ 'NC1': dict({ 'black_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'generator_action': , 'grid_action': , 'id': 'NC1', 'load_name': '', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': False, 'priority': 1.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), 'NC2': dict({ 'black_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'generator_action': , 'grid_action': , 'id': 'NC2', 'load_name': '', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': False, 'priority': 2.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), 'NO1': dict({ 'black_start': 5.0, 'essential_end_time': 82800.0, 'essential_start_time': 21600.0, 'generator_action': , 'grid_action': , 'id': 'NO1', 'load_name': 'Fridge and Freezer', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': True, 'priority': 1.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), 'NO2': dict({ 'black_start': 5.0, 'essential_end_time': 82800.0, 'essential_start_time': 21600.0, 'generator_action': , 'grid_action': , 'id': 'NO2', 'load_name': 'HVAC and Furnace', 'manual_override': True, 'micro_grid_action': , 'mode': , 'override': True, 'priority': 4.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': , }), }), 'dry_contact_status': dict({ 'NC1': dict({ 'id': 'NC1', 'status': , }), 'NC2': dict({ 'id': 'NC2', 'status': , }), 'NO1': dict({ 'id': 'NO1', 'status': , }), 'NO2': dict({ 'id': 'NO2', 'status': , }), }), 'encharge_aggregate': dict({ 'available_energy': 3292, 'backup_reserve': 1680, 'configured_reserve_state_of_charge': 50, 'max_available_capacity': 3360, 'reserve_state_of_charge': 50, 'state_of_charge': 98, }), 'encharge_inventory': dict({ '492234001350': dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_firmware_version': '2.1.34', 'comm_level_2_4_ghz': 2, 'comm_level_sub_ghz': 2, 'communicating': True, 'dc_switch_off': False, 'encharge_capacity': 3360, 'encharge_revision': 2, 'firmware_loaded_date': 1718210586, 'firmware_version': '2.0.6727_rel/22.15', 'installed_date': 1718210586, 'last_report_date': 1718213052, 'led_status': 12, 'max_cell_temp': 27, 'operating': None, 'part_number': '836-00750-r32', 'percent_full': 98, 'serial_number': '492234001350', 'temperature': 27, 'temperature_unit': 'C', 'zigbee_dongle_fw_version': None, }), }), 'encharge_power': dict({ '492234001350': dict({ 'apparent_power_mva': -1250000, 'real_power_mw': -1250000, 'soc': 98, }), }), 'enpower': dict({ 'admin_state': 30, 'admin_state_str': 'ENPWR_STATE_OPER_GEN_CLOSE', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'firmware_loaded_date': 1718209911, 'firmware_version': '2.0.5729_rel/22.15', 'grid_mode': 'multimode-ongrid', 'installed_date': 1718209911, 'last_report_date': 1718213328, 'mains_admin_state': 'closed', 'mains_oper_state': 'open', 'operating': None, 'part_number': '860-00376-r37', 'serial_number': '122210043898', 'temperature': 91, 'temperature_unit': 'F', 'zigbee_dongle_fw_version': None, }), 'inverters': dict({ '482218039091': dict({ 'last_report_date': 1718213113, 'last_report_watts': 67, 'max_report_watts': 122, 'serial_number': '482218039091', }), '482218039209': dict({ 'last_report_date': 1718213114, 'last_report_watts': 61, 'max_report_watts': 115, 'serial_number': '482218039209', }), '482218039304': dict({ 'last_report_date': 1718213115, 'last_report_watts': 69, 'max_report_watts': 132, 'serial_number': '482218039304', }), '482218039386': dict({ 'last_report_date': 1718213116, 'last_report_watts': 64, 'max_report_watts': 112, 'serial_number': '482218039386', }), '482218039390': dict({ 'last_report_date': 1718213117, 'last_report_watts': 63, 'max_report_watts': 123, 'serial_number': '482218039390', }), '482218039529': dict({ 'last_report_date': 1718213143, 'last_report_watts': 75, 'max_report_watts': 120, 'serial_number': '482218039529', }), '482218039700': dict({ 'last_report_date': 1718213203, 'last_report_watts': 89, 'max_report_watts': 135, 'serial_number': '482218039700', }), '482218039736': dict({ 'last_report_date': 1718213204, 'last_report_watts': 84, 'max_report_watts': 118, 'serial_number': '482218039736', }), '482218039788': dict({ 'last_report_date': 1718213234, 'last_report_watts': 95, 'max_report_watts': 100, 'serial_number': '482218039788', }), '482218039880': dict({ 'last_report_date': 1718213235, 'last_report_watts': 96, 'max_report_watts': 134, 'serial_number': '482218039880', }), '482218039911': dict({ 'last_report_date': 1718213236, 'last_report_watts': 97, 'max_report_watts': 133, 'serial_number': '482218039911', }), '482218039918': dict({ 'last_report_date': 1718213237, 'last_report_watts': 99, 'max_report_watts': 136, 'serial_number': '482218039918', }), '482218042609': dict({ 'last_report_date': 1718213237, 'last_report_watts': 95, 'max_report_watts': 107, 'serial_number': '482218042609', }), '482218042662': dict({ 'last_report_date': 1718213239, 'last_report_watts': 90, 'max_report_watts': 116, 'serial_number': '482218042662', }), '482218042737': dict({ 'last_report_date': 1718213240, 'last_report_watts': 96, 'max_report_watts': 130, 'serial_number': '482218042737', }), '482218042901': dict({ 'last_report_date': 1718213242, 'last_report_watts': 96, 'max_report_watts': 103, 'serial_number': '482218042901', }), '482218043030': dict({ 'last_report_date': 1718213242, 'last_report_watts': 95, 'max_report_watts': 102, 'serial_number': '482218043030', }), '482218043257': dict({ 'last_report_date': 1718213243, 'last_report_watts': 98, 'max_report_watts': 137, 'serial_number': '482218043257', }), '482218043590': dict({ 'last_report_date': 1718213245, 'last_report_watts': 95, 'max_report_watts': 108, 'serial_number': '482218043590', }), '482218043592': dict({ 'last_report_date': 1718213264, 'last_report_watts': 98, 'max_report_watts': 106, 'serial_number': '482218043592', }), '482218043652': dict({ 'last_report_date': 1718213265, 'last_report_watts': 101, 'max_report_watts': 107, 'serial_number': '482218043652', }), '482218043981': dict({ 'last_report_date': 1718213266, 'last_report_watts': 96, 'max_report_watts': 121, 'serial_number': '482218043981', }), '482218047061': dict({ 'last_report_date': 1718213267, 'last_report_watts': 100, 'max_report_watts': 125, 'serial_number': '482218047061', }), '482218047087': dict({ 'last_report_date': 1718213268, 'last_report_watts': 101, 'max_report_watts': 101, 'serial_number': '482218047087', }), '482218047088': dict({ 'last_report_date': 1718213269, 'last_report_watts': 98, 'max_report_watts': 104, 'serial_number': '482218047088', }), '482218047099': dict({ 'last_report_date': 1718212938, 'last_report_watts': 74, 'max_report_watts': 107, 'serial_number': '482218047099', }), }), 'raw': dict({ '/admin/lib/tariff': dict({ 'schedule': dict({ 'batt_mode': 'self-consumption', 'battery_mode': 'self-consumption', 'charge_from_grid': False, 'date': '2024-05-27 10:06:36 UTC', 'filename': 'Tariff', 'operation_mode_sub_type': '', 'override': False, 'override_backup_soc': 30, 'override_chg_dischg_rate': 0, 'override_tou_mode': 'StorageTouMode_DEFAULT_TOU_MODE', 'reserved_soc': 50, 'schedule': dict({ 'Disable': list([ dict({ 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), dict({ 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ID', 'start': 0, }), ]), }), ]), 'tariff': list([ dict({ 'Fri': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Mon': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sat': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Sun': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Thu': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Tue': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'Wed': list([ dict({ 'duration': 1440, 'setting': 'ZN', 'start': 0, }), ]), 'end': '1/1', 'start': '1/1', }), ]), }), 'source': 'Tariff', 'version': '00.00.02', 'very_low_soc': 10, }), 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': '1716803909', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'all_days', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'peak_rule': 'DL', 'periods': list([ dict({ 'id': 'period_1', 'rate': 0, 'start': 0, }), ]), }), ]), 'id': 'all_year_long', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0, 'sell': 0.03999900072813034, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1716803909', 'mode': 'self-consumption', 'operation_mode_sub_type': '', 'reserved_soc': 50, 'very_low_soc': 10, }), }), }), '/api/v1/production/inverters': list([ dict({ 'devType': 1, 'lastReportDate': 1718213113, 'lastReportWatts': 67, 'maxReportWatts': 122, 'serialNumber': '482218039091', }), dict({ 'devType': 1, 'lastReportDate': 1718213114, 'lastReportWatts': 61, 'maxReportWatts': 115, 'serialNumber': '482218039209', }), dict({ 'devType': 1, 'lastReportDate': 1718213115, 'lastReportWatts': 69, 'maxReportWatts': 132, 'serialNumber': '482218039304', }), dict({ 'devType': 1, 'lastReportDate': 1718213116, 'lastReportWatts': 64, 'maxReportWatts': 112, 'serialNumber': '482218039386', }), dict({ 'devType': 1, 'lastReportDate': 1718213117, 'lastReportWatts': 63, 'maxReportWatts': 123, 'serialNumber': '482218039390', }), dict({ 'devType': 1, 'lastReportDate': 1718213143, 'lastReportWatts': 75, 'maxReportWatts': 120, 'serialNumber': '482218039529', }), dict({ 'devType': 1, 'lastReportDate': 1718213203, 'lastReportWatts': 89, 'maxReportWatts': 135, 'serialNumber': '482218039700', }), dict({ 'devType': 1, 'lastReportDate': 1718213204, 'lastReportWatts': 84, 'maxReportWatts': 118, 'serialNumber': '482218039736', }), dict({ 'devType': 1, 'lastReportDate': 1718213234, 'lastReportWatts': 95, 'maxReportWatts': 100, 'serialNumber': '482218039788', }), dict({ 'devType': 1, 'lastReportDate': 1718213235, 'lastReportWatts': 96, 'maxReportWatts': 134, 'serialNumber': '482218039880', }), dict({ 'devType': 1, 'lastReportDate': 1718213236, 'lastReportWatts': 97, 'maxReportWatts': 133, 'serialNumber': '482218039911', }), dict({ 'devType': 1, 'lastReportDate': 1718213237, 'lastReportWatts': 99, 'maxReportWatts': 136, 'serialNumber': '482218039918', }), dict({ 'devType': 1, 'lastReportDate': 1718213237, 'lastReportWatts': 95, 'maxReportWatts': 107, 'serialNumber': '482218042609', }), dict({ 'devType': 1, 'lastReportDate': 1718213239, 'lastReportWatts': 90, 'maxReportWatts': 116, 'serialNumber': '482218042662', }), dict({ 'devType': 1, 'lastReportDate': 1718213240, 'lastReportWatts': 96, 'maxReportWatts': 130, 'serialNumber': '482218042737', }), dict({ 'devType': 1, 'lastReportDate': 1718213242, 'lastReportWatts': 96, 'maxReportWatts': 103, 'serialNumber': '482218042901', }), dict({ 'devType': 1, 'lastReportDate': 1718213242, 'lastReportWatts': 95, 'maxReportWatts': 102, 'serialNumber': '482218043030', }), dict({ 'devType': 1, 'lastReportDate': 1718213243, 'lastReportWatts': 98, 'maxReportWatts': 137, 'serialNumber': '482218043257', }), dict({ 'devType': 1, 'lastReportDate': 1718213245, 'lastReportWatts': 95, 'maxReportWatts': 108, 'serialNumber': '482218043590', }), dict({ 'devType': 1, 'lastReportDate': 1718213264, 'lastReportWatts': 98, 'maxReportWatts': 106, 'serialNumber': '482218043592', }), dict({ 'devType': 1, 'lastReportDate': 1718213265, 'lastReportWatts': 101, 'maxReportWatts': 107, 'serialNumber': '482218043652', }), dict({ 'devType': 1, 'lastReportDate': 1718213266, 'lastReportWatts': 96, 'maxReportWatts': 121, 'serialNumber': '482218043981', }), dict({ 'devType': 1, 'lastReportDate': 1718213267, 'lastReportWatts': 100, 'maxReportWatts': 125, 'serialNumber': '482218047061', }), dict({ 'devType': 1, 'lastReportDate': 1718213268, 'lastReportWatts': 101, 'maxReportWatts': 101, 'serialNumber': '482218047087', }), dict({ 'devType': 1, 'lastReportDate': 1718213269, 'lastReportWatts': 98, 'maxReportWatts': 104, 'serialNumber': '482218047088', }), dict({ 'devType': 1, 'lastReportDate': 1718212938, 'lastReportWatts': 74, 'maxReportWatts': 107, 'serialNumber': '482218047099', }), ]), '/ivp/ensemble/dry_contacts': dict({ 'dry_contacts': list([ dict({ 'id': 'NC1', 'status': 'closed', }), dict({ 'id': 'NC2', 'status': 'closed', }), dict({ 'id': 'NO1', 'status': 'closed', }), dict({ 'id': 'NO2', 'status': 'closed', }), ]), }), '/ivp/ensemble/inventory': list([ dict({ 'devices': list([ dict({ 'admin_state': 6, 'admin_state_str': 'ENCHG_STATE_READY', 'bmu_fw_version': '2.1.34', 'comm_level_2_4_ghz': 2, 'comm_level_sub_ghz': 2, 'communicating': True, 'created_date': 1718210586, 'dc_switch_off': False, 'der_index': 2, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'encharge_capacity': 3360, 'encharge_rev': 2, 'img_load_date': 1718210586, 'img_pnum_running': '2.0.6727_rel/22.15', 'installed': 1718210586, 'last_rpt_date': 1718213052, 'led_status': 12, 'maxCellTemp': 27, 'part_num': '836-00750-r32', 'percentFull': 98, 'phase': 'ph-a', 'reported_enc_grid_state': 'grid-tied', 'serial_num': '492234001350', 'sleep_enabled': False, 'temperature': 27, }), ]), 'type': 'ENCHARGE', }), dict({ 'devices': list([ dict({ 'Enchg_grid_mode': 'multimode-generator', 'Enpwr_curr_state_id': 128, 'Enpwr_grid_mode': 'multimode-ongrid', 'Enpwr_relay_state_bm': 16124, 'admin_state': 30, 'admin_state_str': 'ENPWR_STATE_OPER_GEN_CLOSE', 'comm_level_2_4_ghz': 5, 'comm_level_sub_ghz': 5, 'communicating': True, 'created_date': 1718209911, 'device_status': list([ 'envoy.global.ok', 'prop.done', ]), 'img_load_date': 1718209911, 'img_pnum_running': '2.0.5729_rel/22.15', 'installed': 1718209911, 'last_rpt_date': 1718213328, 'mains_admin_state': 'closed', 'mains_oper_state': 'open', 'part_num': '860-00376-r37', 'serial_num': '122210043898', 'temperature': 91, }), ]), 'type': 'ENPOWER', }), ]), '/ivp/ensemble/power': dict({ 'devices:': list([ dict({ 'apparent_power_mva': -1250000, 'real_power_mw': -1250000, 'serial_num': '492234001350', 'soc': 98, }), ]), }), '/ivp/ensemble/secctrl': dict({ 'ACB_agg_energy': 0, 'ACB_agg_soc': 0, 'Commission_in_progress': False, 'ENC_agg_avail_energy': 3292, 'ENC_agg_backup_energy': 1680, 'ENC_agg_soc': 98, 'ENC_agg_soh': 100, 'ESS_in_progress': False, 'Enc_commissioned_capacity': 3360, 'Enc_max_available_capacity': 3360, 'Max_energy': 3360, 'VLS_Limit': 10, 'adjusted_backup_soc': 50, 'agg_soc': 98, 'configured_backup_soc': 50, 'freq_bias_hz': -1.3200000524520874, 'freq_bias_hz_phaseb': 0.0, 'freq_bias_hz_phasec': 0.0, 'freq_bias_hz_q8': -2123, 'freq_bias_hz_q8_phaseb': 0, 'freq_bias_hz_q8_phasec': 0, 'shutdown': False, 'soc_rec_enabled': False, 'soc_recovery_entry': 0, 'soc_recovery_exit': 10, 'voltage_bias_v': -15.69999885559082, 'voltage_bias_v_phaseb': 0.0, 'voltage_bias_v_phasec': 0.0, 'voltage_bias_v_q5': -502, 'voltage_bias_v_q5_phaseb': 0, 'voltage_bias_v_q5_phasec': 0, }), '/ivp/meters': list([ dict({ 'eid': 704643328, 'measurementType': 'production', 'meteringStatus': 'normal', 'phaseCount': 2, 'phaseMode': 'split', 'state': 'enabled', 'statusFlags': list([ ]), }), dict({ 'eid': 704643584, 'measurementType': 'net-consumption', 'meteringStatus': 'normal', 'phaseCount': 2, 'phaseMode': 'split', 'state': 'enabled', 'statusFlags': list([ ]), }), ]), '/ivp/meters/readings': list([ dict({ 'actEnergyDlvd': 15097304.67, 'actEnergyRcvd': 15.392, 'activePower': 2336.093, 'apparentEnergy': 18631234.536, 'apparentPower': 2643.758, 'channels': list([ dict({ 'actEnergyDlvd': 7551632.356, 'actEnergyRcvd': 7.79, 'activePower': 1172.624, 'apparentEnergy': 9315712.558, 'apparentPower': 1324.867, 'current': 10.607, 'eid': 1778385169, 'freq': 60.062, 'instantaneousDemand': 1172.624, 'pwrFactor': 0.883, 'reactEnergyLagg': 2061239.812, 'reactEnergyLead': 2910.699, 'reactivePower': -557.096, 'timestamp': 1718213332, 'voltage': 121.774, }), dict({ 'actEnergyDlvd': 7545672.313, 'actEnergyRcvd': 7.603, 'activePower': 1163.469, 'apparentEnergy': 9315521.977, 'apparentPower': 1318.892, 'current': 10.615, 'eid': 1778385170, 'freq': 60.062, 'instantaneousDemand': 1163.469, 'pwrFactor': 0.877, 'reactEnergyLagg': 2054781.564, 'reactEnergyLead': 4234.214, 'reactivePower': -554.743, 'timestamp': 1718213332, 'voltage': 121.113, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 0.0, 'activePower': 0.0, 'apparentEnergy': 0.0, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385171, 'freq': 60.062, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 0.0, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1718213332, 'voltage': 0.0, }), ]), 'current': 21.222, 'eid': 704643328, 'freq': 60.062, 'instantaneousDemand': 2336.093, 'pwrFactor': 0.88, 'reactEnergyLagg': 4116021.375, 'reactEnergyLead': 7144.913, 'reactivePower': -1111.839, 'timestamp': 1718213332, 'voltage': 242.887, }), dict({ 'actEnergyDlvd': 13632727.119, 'actEnergyRcvd': 6336017.38, 'activePower': 195.575, 'apparentEnergy': 23220664.459, 'apparentPower': 1088.544, 'channels': list([ dict({ 'actEnergyDlvd': 7037858.755, 'actEnergyRcvd': 2542489.025, 'activePower': 267.695, 'apparentEnergy': 11417171.695, 'apparentPower': 574.709, 'current': 4.859, 'eid': 1778385425, 'freq': 60.0, 'instantaneousDemand': 267.695, 'pwrFactor': 0.637, 'reactEnergyLagg': 417029.372, 'reactEnergyLead': 4242565.474, 'reactivePower': 474.518, 'timestamp': 1718213332, 'voltage': 121.856, }), dict({ 'actEnergyDlvd': 6594868.364, 'actEnergyRcvd': 3793528.355, 'activePower': -72.12, 'apparentEnergy': 11803492.765, 'apparentPower': 513.834, 'current': 4.239, 'eid': 1778385426, 'freq': 60.0, 'instantaneousDemand': -72.12, 'pwrFactor': 0.081, 'reactEnergyLagg': 68699.07, 'reactEnergyLead': 3480803.913, 'reactivePower': 464.057, 'timestamp': 1718213332, 'voltage': 121.192, }), dict({ 'actEnergyDlvd': 0.0, 'actEnergyRcvd': 0.0, 'activePower': 0.0, 'apparentEnergy': 0.0, 'apparentPower': 0.0, 'current': 0.0, 'eid': 1778385427, 'freq': 60.0, 'instantaneousDemand': 0.0, 'pwrFactor': 0.0, 'reactEnergyLagg': 0.0, 'reactEnergyLead': 0.0, 'reactivePower': 0.0, 'timestamp': 1718213332, 'voltage': 0.0, }), ]), 'current': 9.098, 'eid': 704643584, 'freq': 60.0, 'instantaneousDemand': 195.575, 'pwrFactor': 0.398, 'reactEnergyLagg': 485728.442, 'reactEnergyLead': 7723369.387, 'reactivePower': 938.575, 'timestamp': 1718213332, 'voltage': 243.047, }), ]), '/ivp/ss/dry_contact_settings': dict({ 'dry_contacts': list([ dict({ 'black_s_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'gen_action': 'apply', 'grid_action': 'apply', 'id': 'NC1', 'load_name': '', 'manual_override': 'true', 'micro_grid_action': 'apply', 'mode': 'manual', 'override': 'false', 'priority': 1.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'NONE', }), dict({ 'black_s_start': 5.0, 'essential_end_time': 57600.0, 'essential_start_time': 32400.0, 'gen_action': 'apply', 'grid_action': 'apply', 'id': 'NC2', 'load_name': '', 'manual_override': 'true', 'micro_grid_action': 'apply', 'mode': 'manual', 'override': 'false', 'priority': 2.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'NONE', }), dict({ 'black_s_start': 5.0, 'essential_end_time': 82800.0, 'essential_start_time': 21600.0, 'gen_action': 'shed', 'grid_action': 'shed', 'id': 'NO1', 'load_name': 'Fridge and Freezer', 'manual_override': 'true', 'micro_grid_action': 'shed', 'mode': 'manual', 'override': 'true', 'priority': 1.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'LOAD', }), dict({ 'black_s_start': 5.0, 'essential_end_time': 82800.0, 'essential_start_time': 21600.0, 'gen_action': 'shed', 'grid_action': 'shed', 'id': 'NO2', 'load_name': 'HVAC and Furnace', 'manual_override': 'true', 'micro_grid_action': 'apply', 'mode': 'manual', 'override': 'true', 'priority': 4.0, 'pv_serial_nb': list([ ]), 'soc_high': 70.0, 'soc_low': 30.0, 'type': 'LOAD', }), ]), }), '/ivp/ss/gen_config': dict({ 'charge_from_generator': True, 'cool_down_mins': 0, 'gen_type': 'Standby', 'generator_id': '', 'last_updated_by': 'ITK', 'manufacturer': 'Generac', 'max_cont_gen_amps': 58.3, 'max_gen_efficiency_perc': 100, 'min_gen_loading_perc': 5, 'model': 'G007223-0, G007224-0, G007225-0 (14kW)', 'name_plate_rating_wat': 14.0, 'start_method': 'Auto', 'warm_up_mins': 0, }), '/production.json?details=1': dict({ 'consumption': list([ dict({ 'activeCount': 1, 'apprntPwr': 2775.526, 'measurementType': 'total-consumption', 'pwrFactor': 0.92, 'reactPwr': -197.689, 'readingTime': 1718213330, 'rmsCurrent': 22.811, 'rmsVoltage': 243.1, 'type': 'eim', 'vahLifetime': 23220663.814, 'vahToday': 1585.814, 'varhLagLifetime': -3630293.476, 'varhLagToday': 598.0, 'varhLeadLifetime': 7716225.126, 'varhLeadToday': 0.0, 'wNow': 2670.058, 'whLastSevenDays': 882.448, 'whLifetime': 22392008.448, 'whToday': 3333.448, }), dict({ 'activeCount': 1, 'apprntPwr': 54.157, 'measurementType': 'net-consumption', 'pwrFactor': 1.0, 'reactPwr': 892.549, 'readingTime': 1718213330, 'rmsCurrent': 0.422, 'rmsVoltage': 243.1, 'type': 'eim', 'vahLifetime': 23220663.814, 'vahToday': 0, 'varhLagLifetime': 485727.899, 'varhLagToday': 0, 'varhLeadLifetime': 7723369.387, 'varhLeadToday': 0, 'wNow': 240.397, 'whLastSevenDays': 0, 'whLifetime': 7298714.07, 'whToday': 0, }), ]), 'production': list([ dict({ 'activeCount': 26, 'readingTime': 1718213270, 'type': 'inverters', 'wNow': 2317, 'whLifetime': 1107526, }), dict({ 'activeCount': 1, 'apprntPwr': 2707.323, 'measurementType': 'production', 'pwrFactor': 0.92, 'reactPwr': -1090.238, 'readingTime': 1718213330, 'rmsCurrent': 22.389, 'rmsVoltage': 242.897, 'type': 'eim', 'vahLifetime': 18631233.018, 'vahToday': 2965.018, 'varhLagLifetime': 4116021.375, 'varhLagToday': 3.375, 'varhLeadLifetime': 7144.262, 'varhLeadToday': 959.262, 'wNow': 2429.661, 'whLastSevenDays': 360056.35, 'whLifetime': 15097303.35, 'whToday': 2645.35, }), ]), 'storage': list([ dict({ 'activeCount': 0, 'readingTime': 0, 'state': 'idle', 'type': 'acb', 'wNow': 0, 'whNow': 0, }), ]), }), }), 'system_consumption': dict({ 'watt_hours_last_7_days': 882, 'watt_hours_lifetime': 22392008, 'watt_hours_today': 3333, 'watts_now': 2670, }), 'system_consumption_phases': None, 'system_production': dict({ 'watt_hours_last_7_days': 360056, 'watt_hours_lifetime': 15097303, 'watt_hours_today': 2645, 'watts_now': 2430, }), 'system_production_phases': None, 'tariff': dict({ 'currency': dict({ 'code': 'USD', }), 'date': '1716803909', 'logger': 'mylogger', 'seasons': list([ dict({ 'days': list([ dict({ 'days': 'Mon,Tue,Wed,Thu,Fri,Sat,Sun', 'enable_discharge_to_grid': False, 'id': 'all_days', 'must_charge_duration': 0, 'must_charge_mode': 'CP', 'must_charge_start': 0, 'peak_rule': 'DL', 'periods': list([ dict({ 'id': 'period_1', 'rate': 0, 'start': 0, }), ]), }), ]), 'id': 'all_year_long', 'start': '1/1', 'tiers': list([ ]), }), ]), 'seasons_sell': list([ ]), 'single_rate': dict({ 'rate': 0, 'sell': 0.03999900072813034, }), 'storage_settings': dict({ 'charge_from_grid': False, 'date': '1716803909', 'mode': , 'operation_mode_sub_type': '', 'reserved_soc': 50, 'very_low_soc': 10, }), }), }) # --- pyenphase-pyenphase-1bfa6dd/tests/common.py000066400000000000000000000103231464551303400212610ustar00rootroot00000000000000"""common test functions for pyenphase.""" import json from os import listdir from os.path import isfile, join from pathlib import Path from typing import Any import orjson import respx from httpx import Response from pyenphase import Envoy from pyenphase.envoy import SupportedFeatures from pyenphase.updaters.base import EnvoyUpdater def _fixtures_dir() -> Path: """Return location of fixture folder.""" return Path(__file__).parent / "fixtures" def load_fixture(version: str, name: str) -> str: """Return fixture file content as text.""" with open(_fixtures_dir() / version / name) as read_in: return read_in.read() def load_json_fixture(version: str, name: str) -> dict[str, Any]: """Return fixture file content as JSON.""" return orjson.loads(load_fixture(version, name)) def load_json_list_fixture(version: str, name: str) -> list[dict[str, Any]]: """Return list[json] fixture file content as json""" return orjson.loads(load_fixture(version, name)) def start_7_firmware_mock() -> None: """Setup response mocks for Enlighten and Envoy token requests.""" respx.post("https://enlighten.enphaseenergy.com/login/login.json?").mock( return_value=Response( 200, json={ "session_id": "1234567890", "user_id": "1234567890", "user_name": "test", "first_name": "Test", "is_consumer": True, "manager_token": "1234567890", }, ) ) respx.post("https://entrez.enphaseenergy.com/tokens").mock( return_value=Response(200, text="token") ) respx.get("/auth/check_jwt").mock(return_value=Response(200, json={})) async def get_mock_envoy(update: bool = True): # type: ignore[no-untyped-def] """Return a mock Envoy.""" envoy = Envoy("127.0.0.1") await envoy.setup() await envoy.authenticate("username", "password") if update: await envoy.update() await envoy.update() # make sure we can update twice return envoy def prep_envoy( version: str, info: bool = False, #: if true mock info meters: bool = True, #: if true mock meters inverters: bool = True, #: if true mock inverters ) -> None: """setup response mocks for envoy requests.""" path = f"{_fixtures_dir()}/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if info: respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) if meters: respx.get("/ivp/meters").mock(return_value=Response(200, text="[]")) respx.get("/production").mock( return_value=Response(200, text=load_fixture(version, "production")) ) respx.get("/production.json").mock( return_value=Response(200, text=load_fixture(version, "production.json")) ) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) if inverters: respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(401)) if "ivp_ss_gen_config" in files: try: json_data = load_json_fixture(version, "ivp_ss_gen_config") except json.decoder.JSONDecodeError: json_data = {} respx.get("/ivp/ss/gen_config").mock(return_value=Response(200, json=json_data)) else: respx.get("/ivp/ss/gen_config").mock(return_value=Response(200, json={})) def updater_features(updaters: list[EnvoyUpdater]) -> dict[str, SupportedFeatures]: """Return the updater supported features flags""" return {type(updater).__name__: updater._supported_features for updater in updaters} pyenphase-pyenphase-1bfa6dd/tests/conftest.py000066400000000000000000000004741464551303400216240ustar00rootroot00000000000000import pytest from syrupy import SnapshotAssertion from tests.syrupy import EnphaseSnapshotExtension @pytest.fixture def snapshot(snapshot: SnapshotAssertion) -> SnapshotAssertion: """Return snapshot assertion fixture with the Enphase extension.""" return snapshot.use_extension(EnphaseSnapshotExtension) pyenphase-pyenphase-1bfa6dd/tests/fixtures/000077500000000000000000000000001464551303400212715ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/000077500000000000000000000000001464551303400220225ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/api_v1_production000066400000000000000000000001621464551303400253710ustar00rootroot00000000000000{ "wattHoursToday": 5481, "wattHoursSevenDays": 389581, "wattHoursLifetime": 93706280, "wattsNow": 5463 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/api_v1_production_inverters000066400000000000000000000125031464551303400274740ustar00rootroot00000000000000[ { "serialNumber": "121512041640", "lastReportDate": 1618082927, "lastReportWatts": 200, "maxReportWatts": 249 }, { "serialNumber": "121512036336", "lastReportDate": 1618082932, "lastReportWatts": 199, "maxReportWatts": 247 }, { "serialNumber": "121512043093", "lastReportDate": 1618082928, "lastReportWatts": 208, "maxReportWatts": 255 }, { "serialNumber": "121512039005", "lastReportDate": 1618082933, "lastReportWatts": 55, "maxReportWatts": 254 }, { "serialNumber": "121512041456", "lastReportDate": 1618082937, "lastReportWatts": 13, "maxReportWatts": 79 }, { "serialNumber": "121512043153", "lastReportDate": 1618082935, "lastReportWatts": 18, "maxReportWatts": 146 }, { "serialNumber": "121512038691", "lastReportDate": 1618082942, "lastReportWatts": 26, "maxReportWatts": 247 }, { "serialNumber": "121512039090", "lastReportDate": 1618082946, "lastReportWatts": 32, "maxReportWatts": 194 }, { "serialNumber": "121512038982", "lastReportDate": 1618082950, "lastReportWatts": 203, "maxReportWatts": 253 }, { "serialNumber": "121512042344", "lastReportDate": 1618082952, "lastReportWatts": 205, "maxReportWatts": 253 }, { "serialNumber": "121512039143", "lastReportDate": 1618082956, "lastReportWatts": 104, "maxReportWatts": 245 }, { "serialNumber": "121512009183", "lastReportDate": 1618082961, "lastReportWatts": 204, "maxReportWatts": 253 }, { "serialNumber": "121512039093", "lastReportDate": 1618082966, "lastReportWatts": 209, "maxReportWatts": 256 }, { "serialNumber": "121512042132", "lastReportDate": 1618082924, "lastReportWatts": 200, "maxReportWatts": 250 }, { "serialNumber": "121512043135", "lastReportDate": 1618082923, "lastReportWatts": 205, "maxReportWatts": 254 }, { "serialNumber": "121512043173", "lastReportDate": 1618082966, "lastReportWatts": 200, "maxReportWatts": 247 }, { "serialNumber": "121512039018", "lastReportDate": 1618082964, "lastReportWatts": 27, "maxReportWatts": 252 }, { "serialNumber": "121512036221", "lastReportDate": 1618082963, "lastReportWatts": 8, "maxReportWatts": 116 }, { "serialNumber": "121512038619", "lastReportDate": 1618082962, "lastReportWatts": 203, "maxReportWatts": 252 }, { "serialNumber": "121512038919", "lastReportDate": 1618082959, "lastReportWatts": 102, "maxReportWatts": 238 }, { "serialNumber": "121512006273", "lastReportDate": 1618082959, "lastReportWatts": 206, "maxReportWatts": 254 }, { "serialNumber": "121512043222", "lastReportDate": 1618082957, "lastReportWatts": 207, "maxReportWatts": 254 }, { "serialNumber": "121512038416", "lastReportDate": 1618082953, "lastReportWatts": 151, "maxReportWatts": 251 }, { "serialNumber": "121512043200", "lastReportDate": 1618082955, "lastReportWatts": 203, "maxReportWatts": 253 }, { "serialNumber": "121512044424", "lastReportDate": 1618082954, "lastReportWatts": 106, "maxReportWatts": 239 }, { "serialNumber": "121512041747", "lastReportDate": 1618082925, "lastReportWatts": 64, "maxReportWatts": 248 }, { "serialNumber": "121512039075", "lastReportDate": 1618082930, "lastReportWatts": 102, "maxReportWatts": 237 }, { "serialNumber": "121512043587", "lastReportDate": 1618082934, "lastReportWatts": 202, "maxReportWatts": 253 }, { "serialNumber": "121512043086", "lastReportDate": 1618082942, "lastReportWatts": 202, "maxReportWatts": 250 }, { "serialNumber": "121512039091", "lastReportDate": 1618082939, "lastReportWatts": 27, "maxReportWatts": 252 }, { "serialNumber": "121512039181", "lastReportDate": 1618082943, "lastReportWatts": 101, "maxReportWatts": 238 }, { "serialNumber": "121512033008", "lastReportDate": 1618082947, "lastReportWatts": 101, "maxReportWatts": 243 }, { "serialNumber": "121512037453", "lastReportDate": 1618082949, "lastReportWatts": 205, "maxReportWatts": 255 }, { "serialNumber": "121512038421", "lastReportDate": 1618082949, "lastReportWatts": 14, "maxReportWatts": 233 }, { "serialNumber": "121512038845", "lastReportDate": 1618082945, "lastReportWatts": 203, "maxReportWatts": 253 }, { "serialNumber": "121512038901", "lastReportDate": 1618082944, "lastReportWatts": 102, "maxReportWatts": 245 }, { "serialNumber": "121512039124", "lastReportDate": 1618082938, "lastReportWatts": 205, "maxReportWatts": 254 }, { "serialNumber": "121512036220", "lastReportDate": 1618082927, "lastReportWatts": 198, "maxReportWatts": 245 }, { "serialNumber": "121512038762", "lastReportDate": 1618082930, "lastReportWatts": 203, "maxReportWatts": 253 }, { "serialNumber": "121512043574", "lastReportDate": 1618082936, "lastReportWatts": 203, "maxReportWatts": 253 }, { "serialNumber": "121512036250", "lastReportDate": 1618082940, "lastReportWatts": 20, "maxReportWatts": 190 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/api_v1_production_inverters_log.json000066400000000000000000000002021464551303400312760ustar00rootroot00000000000000{"headers": {"date": "Wed, 09 Aug 2023 01:11:03 GMT", "content-type": "application/json", "content-length": "5456"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/api_v1_production_log.json000066400000000000000000000002011464551303400271740ustar00rootroot00000000000000{"headers": {"date": "Wed, 09 Aug 2023 01:11:03 GMT", "content-type": "application/json", "content-length": "116"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/info000066400000000000000000000023531464551303400227030ustar00rootroot00000000000000 121430030548 800-00069-r05 D3.17.3 4c8675 0 1 033b78 01.02.245 500-00004-r01 702db9 02.01.22 500-00008-r01 ad8746 02.01.15 500-00010-r01 0b54c5 02.00.01 590-00015-r01 0e8c7a 03.17.03 500-00002-r01 54a6dc 02.00.00 500-00016-r01 80e63f 02.04.00 500-00003-r01 802 01.02.00 500-00001-r01 pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/info_log.json000066400000000000000000000002021464551303400245030ustar00rootroot00000000000000{"headers": {"pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "application/json"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/ivp_ensemble_dry_contacts000066400000000000000000000000401464551303400271630ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/ivp_ensemble_dry_contacts_log.json000066400000000000000000000001531464551303400310010ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/ivp_ensemble_inventory000066400000000000000000000000401464551303400265240ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/ivp_ensemble_inventory_log.json000066400000000000000000000001531464551303400303420ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/ivp_ss_dry_contact_settings000066400000000000000000000000401464551303400275530ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/ivp_ss_dry_contact_settings_log.json000066400000000000000000000001531464551303400313710ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/production000066400000000000000000000007431464551303400241370ustar00rootroot00000000000000

System Energy Production

System has been live since
Tue Nov 17, 2015 11:05 AM HST
Currently 6.63 kW
Today 53.6 kWh
Past Week 405 kWh
Since Installation 133 MWh

pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/production.json000066400000000000000000000010431464551303400251010ustar00rootroot00000000000000
Emu

Page Not Found

The page you tried to view does not exist Try the home page

pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/production.json_log.json000066400000000000000000000002421464551303400267120ustar00rootroot00000000000000{"headers": {"pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "application/json", "transfer-encoding": "chunked"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.17.3/production_log.json000066400000000000000000000002421464551303400257420ustar00rootroot00000000000000{"headers": {"pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "application/json", "transfer-encoding": "chunked"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.7.0/000077500000000000000000000000001464551303400217365ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.7.0/info000066400000000000000000000023521464551303400226160ustar00rootroot00000000000000 121430030548 800-00069-r05 D3.7.0 4c8675 0 1 033b78 01.02.245 500-00004-r01 702db9 02.01.22 500-00008-r01 ad8746 02.01.15 500-00010-r01 0b54c5 02.00.01 590-00015-r01 0e8c7a 03.17.03 500-00002-r01 54a6dc 02.00.00 500-00016-r01 80e63f 02.04.00 500-00003-r01 802 01.02.00 500-00001-r01 pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.7.0/info_log.json000066400000000000000000000002021464551303400244170ustar00rootroot00000000000000{"headers": {"pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "application/json"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.7.0/ivp_ensemble_dry_contacts000066400000000000000000000000401464551303400270770ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.7.0/ivp_ensemble_dry_contacts_log.json000066400000000000000000000001531464551303400307150ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.7.0/ivp_ensemble_inventory000066400000000000000000000000401464551303400264400ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.7.0/ivp_ensemble_inventory_log.json000066400000000000000000000001531464551303400302560ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.7.0/ivp_ss_dry_contact_settings000066400000000000000000000000401464551303400274670ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.7.0/ivp_ss_dry_contact_settings_log.json000066400000000000000000000001531464551303400313050ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.7.0/production000066400000000000000000000007431464551303400240530ustar00rootroot00000000000000

System Energy Production

System has been live since
Tue Nov 17, 2015 11:05 AM HST
Currently 6.63 kW
Today 53.6 kWh
Past Week 405 kWh
Since Installation 133 MWh

pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.7.0/production.json000066400000000000000000000010431464551303400250150ustar00rootroot00000000000000
Emu

Page Not Found

The page you tried to view does not exist Try the home page

pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.7.0/production.json_log.json000066400000000000000000000002421464551303400266260ustar00rootroot00000000000000{"headers": {"pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "application/json", "transfer-encoding": "chunked"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.7.0/production_log.json000066400000000000000000000002421464551303400256560ustar00rootroot00000000000000{"headers": {"pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "application/json", "transfer-encoding": "chunked"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/000077500000000000000000000000001464551303400220205ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/admin_lib_tariff000066400000000000000000000010431464551303400252120ustar00rootroot00000000000000
Emu

Page Not Found

The page you tried to view does not exist Try the home page

pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/admin_lib_tariff_log.json000066400000000000000000000002421464551303400270230ustar00rootroot00000000000000{"headers": {"pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "application/json", "transfer-encoding": "chunked"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/api_v1_production000066400000000000000000000001641464551303400253710ustar00rootroot00000000000000{ "wattHoursToday": 25151, "wattHoursSevenDays": 240671, "wattHoursLifetime": 138475913, "wattsNow": 4324 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/api_v1_production_inverters000066400000000000000000000125111464551303400274710ustar00rootroot00000000000000[ { "serialNumber": "121512041640", "lastReportDate": 1703033509, "lastReportWatts": 99, "maxReportWatts": 177 }, { "serialNumber": "121512036336", "lastReportDate": 1703033514, "lastReportWatts": 102, "maxReportWatts": 179 }, { "serialNumber": "121512043093", "lastReportDate": 1703033511, "lastReportWatts": 106, "maxReportWatts": 190 }, { "serialNumber": "121512039005", "lastReportDate": 1703033514, "lastReportWatts": 102, "maxReportWatts": 178 }, { "serialNumber": "121512041456", "lastReportDate": 1703033519, "lastReportWatts": 35, "maxReportWatts": 48 }, { "serialNumber": "121512043153", "lastReportDate": 1703033517, "lastReportWatts": 53, "maxReportWatts": 99 }, { "serialNumber": "121512038691", "lastReportDate": 1703033524, "lastReportWatts": 101, "maxReportWatts": 170 }, { "serialNumber": "121512039090", "lastReportDate": 1703033529, "lastReportWatts": 77, "maxReportWatts": 93 }, { "serialNumber": "121512038982", "lastReportDate": 1703033490, "lastReportWatts": 102, "maxReportWatts": 180 }, { "serialNumber": "121512042344", "lastReportDate": 1703033491, "lastReportWatts": 100, "maxReportWatts": 180 }, { "serialNumber": "121512039143", "lastReportDate": 1703033495, "lastReportWatts": 141, "maxReportWatts": 163 }, { "serialNumber": "121512009183", "lastReportDate": 1703033499, "lastReportWatts": 106, "maxReportWatts": 189 }, { "serialNumber": "121512039093", "lastReportDate": 1703033503, "lastReportWatts": 107, "maxReportWatts": 190 }, { "serialNumber": "121512042132", "lastReportDate": 1703033507, "lastReportWatts": 102, "maxReportWatts": 137 }, { "serialNumber": "121512043135", "lastReportDate": 1703033506, "lastReportWatts": 106, "maxReportWatts": 189 }, { "serialNumber": "121512043173", "lastReportDate": 1703033506, "lastReportWatts": 104, "maxReportWatts": 182 }, { "serialNumber": "121512039018", "lastReportDate": 1703033503, "lastReportWatts": 100, "maxReportWatts": 155 }, { "serialNumber": "121512036221", "lastReportDate": 1703033501, "lastReportWatts": 102, "maxReportWatts": 159 }, { "serialNumber": "121512038619", "lastReportDate": 1703033500, "lastReportWatts": 103, "maxReportWatts": 183 }, { "serialNumber": "121512038919", "lastReportDate": 1703033498, "lastReportWatts": 137, "maxReportWatts": 158 }, { "serialNumber": "121512006273", "lastReportDate": 1703033497, "lastReportWatts": 105, "maxReportWatts": 188 }, { "serialNumber": "121512043222", "lastReportDate": 1703033496, "lastReportWatts": 105, "maxReportWatts": 186 }, { "serialNumber": "121512038416", "lastReportDate": 1703033492, "lastReportWatts": 103, "maxReportWatts": 179 }, { "serialNumber": "121512043200", "lastReportDate": 1703033494, "lastReportWatts": 102, "maxReportWatts": 179 }, { "serialNumber": "121512044424", "lastReportDate": 1703033493, "lastReportWatts": 137, "maxReportWatts": 157 }, { "serialNumber": "121512041747", "lastReportDate": 1703033507, "lastReportWatts": 100, "maxReportWatts": 174 }, { "serialNumber": "121512039075", "lastReportDate": 1703033511, "lastReportWatts": 136, "maxReportWatts": 157 }, { "serialNumber": "121512043587", "lastReportDate": 1703033516, "lastReportWatts": 102, "maxReportWatts": 124 }, { "serialNumber": "121512043086", "lastReportDate": 1703033523, "lastReportWatts": 104, "maxReportWatts": 184 }, { "serialNumber": "121512039091", "lastReportDate": 1703033521, "lastReportWatts": 100, "maxReportWatts": 175 }, { "serialNumber": "121512039181", "lastReportDate": 1703033525, "lastReportWatts": 138, "maxReportWatts": 158 }, { "serialNumber": "121512033008", "lastReportDate": 1703033487, "lastReportWatts": 141, "maxReportWatts": 161 }, { "serialNumber": "121512037453", "lastReportDate": 1703033489, "lastReportWatts": 107, "maxReportWatts": 188 }, { "serialNumber": "121512038421", "lastReportDate": 1703033488, "lastReportWatts": 103, "maxReportWatts": 177 }, { "serialNumber": "121512038845", "lastReportDate": 1703033527, "lastReportWatts": 103, "maxReportWatts": 182 }, { "serialNumber": "121512038901", "lastReportDate": 1703033527, "lastReportWatts": 140, "maxReportWatts": 161 }, { "serialNumber": "121512039124", "lastReportDate": 1703033520, "lastReportWatts": 101, "maxReportWatts": 180 }, { "serialNumber": "121512036220", "lastReportDate": 1703033508, "lastReportWatts": 102, "maxReportWatts": 176 }, { "serialNumber": "121512038762", "lastReportDate": 1703033513, "lastReportWatts": 105, "maxReportWatts": 185 }, { "serialNumber": "121512043574", "lastReportDate": 1703033518, "lastReportWatts": 103, "maxReportWatts": 182 }, { "serialNumber": "121512036250", "lastReportDate": 1703033522, "lastReportWatts": 102, "maxReportWatts": 153 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/api_v1_production_inverters_log.json000066400000000000000000000002021464551303400312740ustar00rootroot00000000000000{"headers": {"date": "Wed, 20 Dec 2023 00:57:11 GMT", "content-type": "application/json", "content-length": "5449"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/api_v1_production_log.json000066400000000000000000000002011464551303400271720ustar00rootroot00000000000000{"headers": {"date": "Wed, 20 Dec 2023 00:57:11 GMT", "content-type": "application/json", "content-length": "116"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/info000066400000000000000000000023541464551303400227020ustar00rootroot00000000000000 121430030548 800-00069-r05 D3.18.10 4c8675 0 1 0b54c5 02.00.01 590-00015-r01 f0855e 03.18.10 500-00002-r01 033b78 01.02.245 500-00004-r01 ad8746 02.01.15 500-00010-r01 54a6dc 02.00.00 500-00016-r01 80e63f 02.04.00 500-00003-r01 807 01.02.00 500-00001-r01 702db9 02.01.22 500-00008-r01 pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/info_log.json000066400000000000000000000002021464551303400245010ustar00rootroot00000000000000{"headers": {"pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "application/json"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ensemble_dry_contacts000066400000000000000000000000401464551303400271610ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ensemble_dry_contacts_log.json000066400000000000000000000001531464551303400307770ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ensemble_generator000066400000000000000000000000401464551303400264530ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ensemble_generator_log.json000066400000000000000000000001531464551303400302710ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ensemble_inventory000066400000000000000000000000401464551303400265220ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ensemble_inventory_log.json000066400000000000000000000001531464551303400303400ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ensemble_power000066400000000000000000000000401464551303400256210ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ensemble_power_log.json000066400000000000000000000001531464551303400274370ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ensemble_secctrl000066400000000000000000000000401464551303400261240ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ensemble_secctrl_log.json000066400000000000000000000001531464551303400277420ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ensemble_status000066400000000000000000000000401464551303400260100ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ensemble_status_log.json000066400000000000000000000001531464551303400276260ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_meters000066400000000000000000000000131464551303400241120ustar00rootroot00000000000000Error: 401 pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_meters_log.json000066400000000000000000000002571464551303400257350ustar00rootroot00000000000000{"headers": {"www-authenticate": "Digest qop=\"auth\", realm=\"enphaseenergy.com\", nonce=\"1703033831\"", "content-type": "text/plain", "content-length": "10"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_meters_readings000066400000000000000000000000401464551303400257660ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_meters_readings_log.json000066400000000000000000000001531464551303400276040ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_sc_pvlimit000066400000000000000000000000401464551303400247640ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_sc_pvlimit_log.json000066400000000000000000000001531464551303400266020ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ss_dry_contact_settings000066400000000000000000000000401464551303400275510ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ss_dry_contact_settings_log.json000066400000000000000000000001531464551303400313670ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ss_gen_config000066400000000000000000000000401464551303400254160ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ss_gen_config_log.json000066400000000000000000000001531464551303400272340ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ss_gen_schedule000066400000000000000000000000401464551303400257450ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ss_gen_schedule_log.json000066400000000000000000000001531464551303400275630ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ss_pel_settings000066400000000000000000000000401464551303400260200ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/ivp_ss_pel_settings_log.json000066400000000000000000000001531464551303400276360ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/production000066400000000000000000000007431464551303400241350ustar00rootroot00000000000000

System Energy Production

System has been live since
Tue Nov 17, 2015 11:05 AM HST
Currently 4.32 kW
Today 25.2 kWh
Past Week 241 kWh
Since Installation 138 MWh

pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/production.json000066400000000000000000000010431464551303400250770ustar00rootroot00000000000000
Emu

Page Not Found

The page you tried to view does not exist Try the home page

pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/production.json_log.json000066400000000000000000000002421464551303400267100ustar00rootroot00000000000000{"headers": {"pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "application/json", "transfer-encoding": "chunked"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.8.10/production_log.json000066400000000000000000000002421464551303400257400ustar00rootroot00000000000000{"headers": {"pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "application/json", "transfer-encoding": "chunked"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/000077500000000000000000000000001464551303400220315ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/api_v1_production000066400000000000000000000001611464551303400253770ustar00rootroot00000000000000{ "wattHoursToday": 1460, "wattHoursSevenDays": 130349, "wattHoursLifetime": 6012540, "wattsNow": 1271 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/api_v1_production_inverters000066400000000000000000000030771464551303400275110ustar00rootroot00000000000000[ { "serialNumber": "121547058993", "lastReportDate": 1618083961, "lastReportWatts": 138, "maxReportWatts": 231 }, { "serialNumber": "121547060394", "lastReportDate": 1618083966, "lastReportWatts": 138, "maxReportWatts": 238 }, { "serialNumber": "121603034267", "lastReportDate": 1618083956, "lastReportWatts": 138, "maxReportWatts": 244 }, { "serialNumber": "121547060402", "lastReportDate": 1618083962, "lastReportWatts": 138, "maxReportWatts": 240 }, { "serialNumber": "121547060638", "lastReportDate": 1618083966, "lastReportWatts": 139, "maxReportWatts": 241 }, { "serialNumber": "121547060646", "lastReportDate": 1618083957, "lastReportWatts": 139, "maxReportWatts": 240 }, { "serialNumber": "121603025842", "lastReportDate": 1618083963, "lastReportWatts": 139, "maxReportWatts": 260 }, { "serialNumber": "121603039216", "lastReportDate": 1618083968, "lastReportWatts": 139, "maxReportWatts": 273 }, { "serialNumber": "121547060652", "lastReportDate": 1618083959, "lastReportWatts": 140, "maxReportWatts": 245 }, { "serialNumber": "121547060495", "lastReportDate": 1618083959, "lastReportWatts": 135, "maxReportWatts": 228 }, { "serialNumber": "121603038867", "lastReportDate": 1618083964, "lastReportWatts": 138, "maxReportWatts": 242 }, { "serialNumber": "121547058983", "lastReportDate": 1618083969, "lastReportWatts": 137, "maxReportWatts": 238 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/api_v1_production_inverters_log.json000066400000000000000000000002301464551303400313060ustar00rootroot00000000000000{ "headers": { "date": "Wed, 09 Aug 2023 00:58:22 GMT", "content-type": "application/json", "content-length": "1491" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/api_v1_production_log.json000066400000000000000000000002271464551303400272130ustar00rootroot00000000000000{ "headers": { "date": "Wed, 09 Aug 2023 00:58:22 GMT", "content-type": "application/json", "content-length": "103" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/info000066400000000000000000000021541464551303400227110ustar00rootroot00000000000000 121426016034 800-00069-r05 R3.9.36 4c8675 0 1 01.01.15 500-00004-r01 a5d803 00.01.15 590-00015-r01 360a7d 01.02.00 500-00001-r01 782 03.09.36 500-00002-r01 a1a93f 01.00.14 500-00008-r01 c14a6d 02.03.00 500-00003-r01 7a4eaa 01.00.01 500-00010-r01 1533e7 pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/info_log.json000066400000000000000000000002241464551303400245160ustar00rootroot00000000000000{ "headers": { "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "text/xml" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/ivp_ensemble_dry_contacts000066400000000000000000000000401464551303400271720ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/ivp_ensemble_dry_contacts_log.json000066400000000000000000000001751464551303400310140ustar00rootroot00000000000000{ "headers": { "content-type": "application/json; charset=ISO-8859-4", "content-length": "31" }, "code": 404 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/ivp_ensemble_inventory000066400000000000000000000000401464551303400265330ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/ivp_ensemble_inventory_log.json000066400000000000000000000001751464551303400303550ustar00rootroot00000000000000{ "headers": { "content-type": "application/json; charset=ISO-8859-4", "content-length": "31" }, "code": 404 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/ivp_ensemble_power000066400000000000000000000000401464551303400256320ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/ivp_ensemble_power_log.json000066400000000000000000000001751464551303400274540ustar00rootroot00000000000000{ "headers": { "content-type": "application/json; charset=ISO-8859-4", "content-length": "31" }, "code": 404 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/ivp_ss_dry_contact_settings000066400000000000000000000000401464551303400275620ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/ivp_ss_dry_contact_settings_log.json000066400000000000000000000001751464551303400314040ustar00rootroot00000000000000{ "headers": { "content-type": "application/json; charset=ISO-8859-4", "content-length": "31" }, "code": 404 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/production000066400000000000000000000347221464551303400241520ustar00rootroot00000000000000 production

System Energy Production

System has been live since
Wed Mar 04, 2020 01:09 PM HST
Currently 0 W
Today 0 Wh
Past Week 0 Wh
Since Installation 14.6 MWh


© 2007-2014, [e] Enphase Energy, Inc. All rights reserved. | Licenses

pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/production.json000066400000000000000000000350131464551303400251140ustar00rootroot00000000000000 error

Emu

Page Not Found

The page you tried to view does not exist Try the home page


© 2007-2014, [e] Enphase Energy, Inc. All rights reserved. | Licenses

pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/production.json_log.json000066400000000000000000000002711464551303400267230ustar00rootroot00000000000000{ "headers": { "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "text/html", "transfer-encoding": "chunked" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36/production_log.json000066400000000000000000000002711464551303400257530ustar00rootroot00000000000000{ "headers": { "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "text/html", "transfer-encoding": "chunked" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/000077500000000000000000000000001464551303400236605ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/admin_lib_tariff000066400000000000000000000000131464551303400270460ustar00rootroot00000000000000Error: 401 pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/admin_lib_tariff_log.json000066400000000000000000000002571464551303400306710ustar00rootroot00000000000000{"headers": {"www-authenticate": "Digest qop=\"auth\", realm=\"enphaseenergy.com\", nonce=\"1694046744\"", "content-type": "text/plain", "content-length": "10"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/api_v1_production000066400000000000000000000001471464551303400272320ustar00rootroot00000000000000{ "wattHoursToday": 0, "wattHoursSevenDays": 0, "wattHoursLifetime": 14578520, "wattsNow": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/api_v1_production_inverters000066400000000000000000000001321464551303400313250ustar00rootroot00000000000000{ "status": 401, "error": "", "info": "Authentication required", "moreInfo": "" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/api_v1_production_inverters_log.json000066400000000000000000000002531464551303400331420ustar00rootroot00000000000000{"headers": {"date": "Thu, 07 Sep 2023 00:32:21 GMT", "www-authenticate": "\u00d8\u00c9\u00c6A", "content-type": "application/json", "content-length": "90"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/api_v1_production_log.json000066400000000000000000000002011464551303400310320ustar00rootroot00000000000000{"headers": {"date": "Thu, 07 Sep 2023 00:32:20 GMT", "content-type": "application/json", "content-length": "103"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/info000066400000000000000000000021541464551303400245400ustar00rootroot00000000000000 121426016034 800-00069-r05 R3.9.36 4c8675 0 1 500-00001-r01 01.02.00 782 500-00010-r01 01.00.01 1533e7 500-00003-r01 02.03.00 7a4eaa 590-00015-r01 00.01.15 360a7d 500-00004-r01 01.01.15 a5d803 500-00002-r01 03.09.36 a1a93f 500-00008-r01 01.00.14 c14a6d pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/info_log.json000066400000000000000000000001721464551303400263470ustar00rootroot00000000000000{"headers": {"pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "text/xml"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ensemble_dry_contacts000066400000000000000000000000401464551303400310210ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ensemble_dry_contacts_log.json000066400000000000000000000001531464551303400326370ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ensemble_generator000066400000000000000000000000401464551303400303130ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ensemble_generator_log.json000066400000000000000000000001531464551303400321310ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ensemble_inventory000066400000000000000000000000401464551303400303620ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ensemble_inventory_log.json000066400000000000000000000001531464551303400322000ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ensemble_secctrl000066400000000000000000000000401464551303400277640ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ensemble_secctrl_log.json000066400000000000000000000001531464551303400316020ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ensemble_status000066400000000000000000000000401464551303400276500ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ensemble_status_log.json000066400000000000000000000001531464551303400314660ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_meters000066400000000000000000000000401464551303400257520ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_meters_log.json000066400000000000000000000001531464551303400275700ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_meters_readings000066400000000000000000000000401464551303400276260ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_meters_readings_log.json000066400000000000000000000001531464551303400314440ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_sc_pvlimit000066400000000000000000000000401464551303400266240ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_sc_pvlimit_log.json000066400000000000000000000001531464551303400304420ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ss_dry_contact_settings000066400000000000000000000000401464551303400314110ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ss_dry_contact_settings_log.json000066400000000000000000000001531464551303400332270ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ss_gen_config000066400000000000000000000000401464551303400272560ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ss_gen_config_log.json000066400000000000000000000001531464551303400310740ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ss_gen_schedule000066400000000000000000000000401464551303400276050ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ss_gen_schedule_log.json000066400000000000000000000001531464551303400314230ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ss_pel_settings000066400000000000000000000000401464551303400276600ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/ivp_ss_pel_settings_log.json000066400000000000000000000001531464551303400314760ustar00rootroot00000000000000{"headers": {"content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/production000066400000000000000000000347221464551303400260010ustar00rootroot00000000000000 production

System Energy Production

System has been live since
Wed Mar 04, 2020 01:09 PM HST
Currently 0 W
Today 0 Wh
Past Week 0 Wh
Since Installation 14.6 MWh


© 2007-2014, [e] Enphase Energy, Inc. All rights reserved. | Licenses

pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/production.json000066400000000000000000000350131464551303400267430ustar00rootroot00000000000000 error

Emu

Page Not Found

The page you tried to view does not exist Try the home page


© 2007-2014, [e] Enphase Energy, Inc. All rights reserved. | Licenses

pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/production.json_log.json000066400000000000000000000002331464551303400305500ustar00rootroot00000000000000{"headers": {"pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "text/html", "transfer-encoding": "chunked"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/3.9.36_bad_auth/production_log.json000066400000000000000000000002331464551303400276000ustar00rootroot00000000000000{"headers": {"pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "content-type": "text/html", "transfer-encoding": "chunked"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/000077500000000000000000000000001464551303400221015ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/admin_lib_tariff000066400000000000000000000005341464551303400252770ustar00rootroot00000000000000{"tariff":{"currency":{"code":"USD"},"single_rate":{"rate":0.21835},"seasons":[{"id":"season_1","start":"1/1","days":[],"tiers":[{"id":"tier_1","limit":500,"rate":0.21835},{"id":"tier_2","limit":1200,"rate":0.19587},{"id":"tier_3","limit":-1,"rate":0.15798}]}]},"schedule":{"source":"Tariff","date":"2023-05-11 19:46:56 UTC","version":"00.00.01"}} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/admin_lib_tariff_log.json000066400000000000000000000003021464551303400271010ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:39 GMT", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "connection": "close", "content-type": "application/json"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/api_v1_production000066400000000000000000000001601464551303400254460ustar00rootroot00000000000000{ "wattHoursToday": 126, "wattHoursSevenDays": 179142, "wattHoursLifetime": 26785314, "wattsNow": 231 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/api_v1_production_inverters000066400000000000000000000054451464551303400275620ustar00rootroot00000000000000[ { "serialNumber": "122002026181", "lastReportDate": 1695301309, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 287 }, { "serialNumber": "122002040286", "lastReportDate": 1695301314, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 299 }, { "serialNumber": "122002010484", "lastReportDate": 1695301305, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 300 }, { "serialNumber": "122002026190", "lastReportDate": 1695301313, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 289 }, { "serialNumber": "122002041618", "lastReportDate": 1695301318, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 292 }, { "serialNumber": "122002021258", "lastReportDate": 1695301327, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 305 }, { "serialNumber": "122002010488", "lastReportDate": 1695301325, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 305 }, { "serialNumber": "122002041626", "lastReportDate": 1695301330, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 306 }, { "serialNumber": "122002017669", "lastReportDate": 1695301327, "devType": 1, "lastReportWatts": 12, "maxReportWatts": 305 }, { "serialNumber": "122002017614", "lastReportDate": 1695301321, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 294 }, { "serialNumber": "122002027876", "lastReportDate": 1695301332, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 306 }, { "serialNumber": "122002011248", "lastReportDate": 1695301330, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 227 }, { "serialNumber": "122002021078", "lastReportDate": 1695301323, "devType": 1, "lastReportWatts": 12, "maxReportWatts": 306 }, { "serialNumber": "122002021381", "lastReportDate": 1695301308, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 305 }, { "serialNumber": "122002041638", "lastReportDate": 1695301314, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 296 }, { "serialNumber": "122002041636", "lastReportDate": 1695301319, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 300 }, { "serialNumber": "122002041621", "lastReportDate": 1695301310, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 197 }, { "serialNumber": "122002010489", "lastReportDate": 1695301317, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 306 }, { "serialNumber": "122002010577", "lastReportDate": 1695301322, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 305 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/api_v1_production_inverters_log.json000066400000000000000000000002701464551303400313620ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:37 GMT, Thu, 21 Sep 2023 13:03:37 GMT", "connection": "close", "content-type": "application/json", "content-length": "2853"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/api_v1_production_log.json000066400000000000000000000002671464551303400272670ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:37 GMT, Thu, 21 Sep 2023 13:03:37 GMT", "connection": "close", "content-type": "application/json", "content-length": "112"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/info000066400000000000000000000032101464551303400227530ustar00rootroot00000000000000 121938119871 800-00555-r03 R4.10.35 4c8675 0 1 true 500-00001-r01 02.00.00 945 500-00011-r01 04.00.00 5bb754 590-00018-r01 02.00.01 426697 500-00002-r01 04.10.35 6ed292 500-00004-r01 01.02.186 d0d70f 500-00008-r01 02.01.22 06e201 500-00010-r01 04.10.25 7b7de5 500-00013-r01 03.02.07 4c9d48 500-00012-r01 02.02.00 c00a8f 500-00016-r01 02.00.00 54a6dc 1542157882 release-4.10.x-103-Nov-12-18-18:25:06 pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/info_log.json000066400000000000000000000003241464551303400245670ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:37 GMT", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "connection": "close", "content-type": "text/xml", "content-length": "1672"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ensemble_dry_contacts000066400000000000000000000000401464551303400272420ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ensemble_dry_contacts_log.json000066400000000000000000000002531464551303400310610ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:39 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ensemble_generator000066400000000000000000000000401464551303400265340ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ensemble_generator_log.json000066400000000000000000000002531464551303400303530ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:40 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ensemble_inventory000066400000000000000000000000401464551303400266030ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ensemble_inventory_log.json000066400000000000000000000002531464551303400304220ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:39 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ensemble_power000066400000000000000000000000401464551303400257020ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ensemble_power_log.json000066400000000000000000000002531464551303400275210ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:39 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ensemble_secctrl000066400000000000000000000000401464551303400262050ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ensemble_secctrl_log.json000066400000000000000000000002531464551303400300240ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:39 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ensemble_status000066400000000000000000000000401464551303400260710ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ensemble_status_log.json000066400000000000000000000002531464551303400277100ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:39 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_meters000066400000000000000000000007121464551303400242010ustar00rootroot00000000000000[ { "eid": 704643328, "state": "enabled", "measurementType": "production", "phaseMode": "split", "phaseCount": 2, "meteringStatus": "normal", "statusFlags": [] }, { "eid": 704643584, "state": "enabled", "measurementType": "net-consumption", "phaseMode": "split", "phaseCount": 2, "meteringStatus": "normal", "statusFlags": [] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_meters_log.json000066400000000000000000000001641464551303400260130ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:40 GMT", "connection": "close", "content-length": "457"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_meters_readings000066400000000000000000000114171464551303400260610ustar00rootroot00000000000000[ { "eid": 704643328, "timestamp": 1695301419, "actEnergyDlvd": 26785327.449, "actEnergyRcvd": 0.001, "apparentEnergy": 33655488.016, "reactEnergyLagg": 10291993.443, "reactEnergyLead": 0.001, "instantaneousDemand": 166.489, "activePower": 166.489, "apparentPower": 457.211, "reactivePower": 383.325, "pwrFactor": 0.394, "voltage": 247.659, "current": 3.692, "freq": 60.000, "channels": [ { "eid": 1778385169, "timestamp": 1695301419, "actEnergyDlvd": 13398797.544, "actEnergyRcvd": 0.001, "apparentEnergy": 16836537.224, "reactEnergyLagg": 5169167.875, "reactEnergyLead": 0.000, "instantaneousDemand": 82.913, "activePower": 82.913, "apparentPower": 228.406, "reactivePower": 191.751, "pwrFactor": 0.400, "voltage": 123.824, "current": 1.844, "freq": 60.000 }, { "eid": 1778385170, "timestamp": 1695301419, "actEnergyDlvd": 13386529.904, "actEnergyRcvd": 0.000, "apparentEnergy": 16818950.792, "reactEnergyLagg": 5122825.568, "reactEnergyLead": 0.001, "instantaneousDemand": 83.576, "activePower": 83.576, "apparentPower": 228.804, "reactivePower": 191.574, "pwrFactor": 0.387, "voltage": 123.836, "current": 1.848, "freq": 60.000 }, { "eid": 1778385171, "timestamp": 1695301419, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 0.000, "current": 0.000, "freq": 60.000 } ] }, { "eid": 704643584, "timestamp": 1695301419, "actEnergyDlvd": 16908208.780, "actEnergyRcvd": 17357690.272, "apparentEnergy": 41943778.605, "reactEnergyLagg": 543219.449, "reactEnergyLead": 13529386.807, "instantaneousDemand": 566.864, "activePower": 566.864, "apparentPower": 1063.035, "reactivePower": -581.018, "pwrFactor": 0.500, "voltage": 247.736, "current": 8.389, "freq": 60.000, "channels": [ { "eid": 1778385425, "timestamp": 1695301419, "actEnergyDlvd": 10220652.219, "actEnergyRcvd": 8001771.780, "apparentEnergy": 22610499.739, "reactEnergyLagg": 87750.153, "reactEnergyLead": 7841689.250, "instantaneousDemand": 393.965, "activePower": 393.965, "apparentPower": 668.739, "reactivePower": -337.072, "pwrFactor": 0.549, "voltage": 123.867, "current": 5.208, "freq": 60.000 }, { "eid": 1778385426, "timestamp": 1695301419, "actEnergyDlvd": 6687556.561, "actEnergyRcvd": 9355918.492, "apparentEnergy": 19333278.866, "reactEnergyLagg": 455469.296, "reactEnergyLead": 5687697.556, "instantaneousDemand": 172.899, "activePower": 172.899, "apparentPower": 394.296, "reactivePower": -243.946, "pwrFactor": 0.426, "voltage": 123.869, "current": 3.181, "freq": 60.000 }, { "eid": 1778385427, "timestamp": 1695301419, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 0.000, "current": 0.000, "freq": 60.000 } ] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_meters_readings_log.json000066400000000000000000000001651464551303400276700ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:40 GMT", "connection": "close", "content-length": "4878"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_sc_pvlimit000066400000000000000000000000401464551303400250450ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_sc_pvlimit_log.json000066400000000000000000000002531464551303400266640ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:40 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ss_dry_contact_settings000066400000000000000000000000401464551303400276320ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ss_dry_contact_settings_log.json000066400000000000000000000002531464551303400314510ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:39 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ss_gen_config000066400000000000000000000000401464551303400254770ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ss_gen_config_log.json000066400000000000000000000002531464551303400273160ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:40 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ss_gen_schedule000066400000000000000000000000401464551303400260260ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ss_gen_schedule_log.json000066400000000000000000000002531464551303400276450ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:40 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ss_pel_settings000066400000000000000000000000401464551303400261010ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/ivp_ss_pel_settings_log.json000066400000000000000000000002531464551303400277200ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:40 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/production000066400000000000000000000000641464551303400242120ustar00rootroot00000000000000

401 Unauthorized

pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/production.json000066400000000000000000000027001464551303400251610ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":19,"readingTime":1695301333,"wNow":246,"whLifetime":26890410},{"type":"eim","activeCount":1,"measurementType":"production","readingTime":1695301418,"wNow":165.53,"whLifetime":26785327.351,"varhLeadLifetime":0.001,"varhLagLifetime":10291993.22,"vahLifetime":33655487.75,"rmsCurrent":3.685,"rmsVoltage":247.631,"reactPwr":381.654,"apprntPwr":457.492,"pwrFactor":0.35,"whToday":139.351,"whLastSevenDays":179155.351,"vahToday":3288.75,"varhLeadToday":0.001,"varhLagToday":3108.22}],"consumption":[{"type":"eim","activeCount":1,"measurementType":"total-consumption","readingTime":1695301418,"wNow":806.405,"whLifetime":26335790.411,"varhLeadLifetime":13529386.465,"varhLagLifetime":10835212.67,"vahLifetime":41943777.997,"rmsCurrent":12.88,"rmsVoltage":247.663,"reactPwr":-959.115,"apprntPwr":3189.788,"pwrFactor":0.25,"whToday":7412.411,"whLastSevenDays":163075.411,"vahToday":9709.997,"varhLeadToday":4281.465,"varhLagToday":3120.67},{"type":"eim","activeCount":1,"measurementType":"net-consumption","readingTime":1695301418,"wNow":640.874,"whLifetime":16908208.46,"varhLeadLifetime":13529386.464,"varhLagLifetime":543219.449,"vahLifetime":41943777.997,"rmsCurrent":9.195,"rmsVoltage":247.696,"reactPwr":-577.46,"apprntPwr":1155.626,"pwrFactor":0.53,"whToday":0,"whLastSevenDays":0,"vahToday":0,"varhLeadToday":0,"varhLagToday":0}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/production.json_log.json000066400000000000000000000003421464551303400267720ustar00rootroot00000000000000{"headers": {"date": "Thu, 21 Sep 2023 13:03:38 GMT", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "connection": "close", "content-type": "application/json", "transfer-encoding": "chunked"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.10.35/production_log.json000066400000000000000000000003271464551303400260250ustar00rootroot00000000000000{"headers": {"www-authenticate": "Digest qop=\"auth\", realm=\"enphaseenergy.com\", nonce=\"Kz8MZRV4a9h25Ea4+ikZbKDannY=\"", "connection": "close", "content-type": "text/html", "content-length": "51"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.2.27/000077500000000000000000000000001464551303400220235ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.2.27/api_v1_production000066400000000000000000000001631464551303400253730ustar00rootroot00000000000000{ "wattHoursToday": 17920, "wattHoursSevenDays": 276614, "wattHoursLifetime": 10279087, "wattsNow": 5894 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.2.27/info000066400000000000000000000034211464551303400227010ustar00rootroot00000000000000 121621012167 800-00551-r02 D4.2.27 4c8675 0 1 false 500-00001-r01 02.00.00 953 500-00011-r01 04.01.15 8f3564 590-00018-r01 02.00.01 426697 500-00002-r01 05.00.62 5e57a9 500-00004-r01 01.02.346 b1b724 500-00008-r01 02.01.22 2faa48 500-00010-r01 05.00.02 4fe435 500-00013-r01 03.02.07 276642 500-00012-r01 02.02.00 a81a58 500-00016-r01 02.00.00 54a6dc 500-00001-r01 02.00.00 953 jenkins-envoy_uber-pkg_5.0-build:pkg-Jul-14-21-16:11:44 1626297189 pyenphase-pyenphase-1bfa6dd/tests/fixtures/4.2.27/production.json000066400000000000000000000035461464551303400251140ustar00rootroot00000000000000{ "consumption": [ { "activeCount": 0, "apprntPwr": 11557.595, "measurementType": "total-consumption", "pwrFactor": 0.5, "reactPwr": -465.213, "readingTime": 1618006624, "rmsCurrent": 47.534, "rmsVoltage": 243.146, "type": "eim", "vahLifetime": 0, "vahToday": 0, "varhLagLifetime": 0, "varhLagToday": 0, "varhLeadLifetime": 0, "varhLeadToday": 0, "wNow": 5811.099, "whLastSevenDays": 0, "whLifetime": 0, "whToday": 0 }, { "activeCount": 0, "apprntPwr": 33.697, "measurementType": "net-consumption", "pwrFactor": 0, "reactPwr": 0, "readingTime": 1618006624, "rmsCurrent": 0.278, "rmsVoltage": 243.015, "type": "eim", "vahLifetime": 0, "vahToday": 0, "varhLagLifetime": 0, "varhLagToday": 0, "varhLeadLifetime": 0, "varhLeadToday": 0, "wNow": -3.769, "whLastSevenDays": 0, "whLifetime": 0, "whToday": 0 } ], "production": [ { "activeCount": 34, "readingTime": 1618005986, "type": "inverters", "wNow": 5891, "whLifetime": 10279087 }, { "activeCount": 0, "apprntPwr": 5816.157, "measurementType": "production", "pwrFactor": 1, "reactPwr": 465.213, "readingTime": 1618006624, "rmsCurrent": 47.811, "rmsVoltage": 243.277, "type": "eim", "vahLifetime": 0, "vahToday": 0, "varhLagLifetime": 0, "varhLagToday": 0, "varhLeadLifetime": 0, "varhLeadToday": 0, "wNow": 5814.869, "whLastSevenDays": 0, "whLifetime": 0, "whToday": 0 } ], "storage": [ { "activeCount": 0, "readingTime": 0, "state": "idle", "type": "acb", "wNow": 0, "whNow": 0 } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.49/000077500000000000000000000000001464551303400220265ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.49/api_v1_production000066400000000000000000000001621464551303400253750ustar00rootroot00000000000000{ "wattHoursToday": 5046, "wattHoursSevenDays": 445686, "wattHoursLifetime": 88742152, "wattsNow": 4859 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.49/api_v1_production_inverters000066400000000000000000000136331464551303400275050ustar00rootroot00000000000000[ { "serialNumber": "121547059079", "lastReportDate": 1618083244, "devType": 1, "lastReportWatts": 130, "maxReportWatts": 257 }, { "serialNumber": "121547059193", "lastReportDate": 1618083250, "devType": 1, "lastReportWatts": 131, "maxReportWatts": 257 }, { "serialNumber": "121547059360", "lastReportDate": 1618083245, "devType": 1, "lastReportWatts": 131, "maxReportWatts": 257 }, { "serialNumber": "121547060384", "lastReportDate": 1618083250, "devType": 1, "lastReportWatts": 134, "maxReportWatts": 257 }, { "serialNumber": "121547059363", "lastReportDate": 1618083255, "devType": 1, "lastReportWatts": 131, "maxReportWatts": 257 }, { "serialNumber": "121547060650", "lastReportDate": 1618083253, "devType": 1, "lastReportWatts": 131, "maxReportWatts": 257 }, { "serialNumber": "121547059128", "lastReportDate": 1618083262, "devType": 1, "lastReportWatts": 135, "maxReportWatts": 257 }, { "serialNumber": "121547059108", "lastReportDate": 1618083266, "devType": 1, "lastReportWatts": 131, "maxReportWatts": 257 }, { "serialNumber": "121547060593", "lastReportDate": 1618083271, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 257 }, { "serialNumber": "121547059102", "lastReportDate": 1618083273, "devType": 1, "lastReportWatts": 134, "maxReportWatts": 257 }, { "serialNumber": "121547060590", "lastReportDate": 1618083277, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 257 }, { "serialNumber": "121547060671", "lastReportDate": 1618083283, "devType": 1, "lastReportWatts": 135, "maxReportWatts": 257 }, { "serialNumber": "121547059354", "lastReportDate": 1618083287, "devType": 1, "lastReportWatts": 132, "maxReportWatts": 257 }, { "serialNumber": "121547059253", "lastReportDate": 1618083289, "devType": 1, "lastReportWatts": 131, "maxReportWatts": 257 }, { "serialNumber": "121547060392", "lastReportDate": 1618083288, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 257 }, { "serialNumber": "121547059112", "lastReportDate": 1618083286, "devType": 1, "lastReportWatts": 132, "maxReportWatts": 257 }, { "serialNumber": "121547060647", "lastReportDate": 1618083285, "devType": 1, "lastReportWatts": 134, "maxReportWatts": 258 }, { "serialNumber": "121547060643", "lastReportDate": 1618083284, "devType": 1, "lastReportWatts": 131, "maxReportWatts": 257 }, { "serialNumber": "121547059217", "lastReportDate": 1618083281, "devType": 1, "lastReportWatts": 137, "maxReportWatts": 257 }, { "serialNumber": "121547055830", "lastReportDate": 1618083280, "devType": 1, "lastReportWatts": 131, "maxReportWatts": 257 }, { "serialNumber": "121547060592", "lastReportDate": 1618083279, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 257 }, { "serialNumber": "121547060758", "lastReportDate": 1618083274, "devType": 1, "lastReportWatts": 130, "maxReportWatts": 255 }, { "serialNumber": "121547059333", "lastReportDate": 1618083277, "devType": 1, "lastReportWatts": 134, "maxReportWatts": 257 }, { "serialNumber": "121547060727", "lastReportDate": 1618083275, "devType": 1, "lastReportWatts": 134, "maxReportWatts": 257 }, { "serialNumber": "121547059008", "lastReportDate": 1618083240, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 257 }, { "serialNumber": "121547060773", "lastReportDate": 1618083247, "devType": 1, "lastReportWatts": 132, "maxReportWatts": 257 }, { "serialNumber": "121547059202", "lastReportDate": 1618083251, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 257 }, { "serialNumber": "121547060761", "lastReportDate": 1618083260, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 257 }, { "serialNumber": "121547060412", "lastReportDate": 1618083258, "devType": 1, "lastReportWatts": 131, "maxReportWatts": 257 }, { "serialNumber": "121547059355", "lastReportDate": 1618083263, "devType": 1, "lastReportWatts": 131, "maxReportWatts": 258 }, { "serialNumber": "121547060415", "lastReportDate": 1618083267, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 257 }, { "serialNumber": "121547060670", "lastReportDate": 1618083270, "devType": 1, "lastReportWatts": 134, "maxReportWatts": 257 }, { "serialNumber": "121547060396", "lastReportDate": 1618083269, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 257 }, { "serialNumber": "121547059107", "lastReportDate": 1618083265, "devType": 1, "lastReportWatts": 132, "maxReportWatts": 257 }, { "serialNumber": "121547059889", "lastReportDate": 1618083264, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 257 }, { "serialNumber": "121547060383", "lastReportDate": 1618083257, "devType": 1, "lastReportWatts": 135, "maxReportWatts": 258 }, { "serialNumber": "121547060766", "lastReportDate": 1618083242, "devType": 1, "lastReportWatts": 132, "maxReportWatts": 257 }, { "serialNumber": "121547059359", "lastReportDate": 1618083247, "devType": 1, "lastReportWatts": 134, "maxReportWatts": 257 }, { "serialNumber": "121547059357", "lastReportDate": 1618083254, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 257 }, { "serialNumber": "121547059381", "lastReportDate": 1618083259, "devType": 1, "lastReportWatts": 132, "maxReportWatts": 257 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.49/info000066400000000000000000000034211464551303400227040ustar00rootroot00000000000000 121621012167 800-00551-r02 D5.0.62 4c8675 0 1 false 500-00001-r01 02.00.00 953 500-00011-r01 04.01.15 8f3564 590-00018-r01 02.00.01 426697 500-00002-r01 05.00.62 5e57a9 500-00004-r01 01.02.346 b1b724 500-00008-r01 02.01.22 2faa48 500-00010-r01 05.00.02 4fe435 500-00013-r01 03.02.07 276642 500-00012-r01 02.02.00 a81a58 500-00016-r01 02.00.00 54a6dc 500-00001-r01 02.00.00 953 jenkins-envoy_uber-pkg_5.0-build:pkg-Jul-14-21-16:11:44 1626297189 pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.49/production.json000066400000000000000000000005121464551303400251050ustar00rootroot00000000000000{ "production": [ { "activeCount": 40, "readingTime": 1618084193, "type": "inverters", "wNow": 6335, "whLifetime": 88745376 } ], "storage": [ { "activeCount": 0, "readingTime": 0, "state": "idle", "type": "acb", "wNow": 0, "whNow": 0 } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/000077500000000000000000000000001464551303400220215ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/admin_lib_tariff000066400000000000000000000003011464551303400252070ustar00rootroot00000000000000{"tariff":{"currency":{"code":"USD"},"single_rate":{"rate":0.0,"sell":0.0},"seasons":[],"seasons_sell":[]},"schedule":{"source":"Tariff","date":"2023-08-10 17:59:03 UTC","version":"00.00.02"}} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/admin_lib_tariff_log.json000066400000000000000000000003021464551303400270210ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:25 GMT", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "connection": "close", "content-type": "application/json"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/api_v1_production000066400000000000000000000001641464551303400253720ustar00rootroot00000000000000{ "wattHoursToday": 20161, "wattHoursSevenDays": 366671, "wattHoursLifetime": 133798553, "wattsNow": 7907 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/api_v1_production_inverters000066400000000000000000000136321464551303400274770ustar00rootroot00000000000000[ { "serialNumber": "121547059079", "lastReportDate": 1694554838, "devType": 1, "lastReportWatts": 202, "maxReportWatts": 246 }, { "serialNumber": "121547059193", "lastReportDate": 1694554845, "devType": 1, "lastReportWatts": 201, "maxReportWatts": 244 }, { "serialNumber": "121547059360", "lastReportDate": 1694554839, "devType": 1, "lastReportWatts": 204, "maxReportWatts": 246 }, { "serialNumber": "121547060384", "lastReportDate": 1694554845, "devType": 1, "lastReportWatts": 206, "maxReportWatts": 248 }, { "serialNumber": "121547059363", "lastReportDate": 1694554852, "devType": 1, "lastReportWatts": 198, "maxReportWatts": 242 }, { "serialNumber": "121547060650", "lastReportDate": 1694554848, "devType": 1, "lastReportWatts": 199, "maxReportWatts": 242 }, { "serialNumber": "121547059128", "lastReportDate": 1694554858, "devType": 1, "lastReportWatts": 204, "maxReportWatts": 248 }, { "serialNumber": "121547059108", "lastReportDate": 1694554865, "devType": 1, "lastReportWatts": 202, "maxReportWatts": 246 }, { "serialNumber": "121547060593", "lastReportDate": 1694554871, "devType": 1, "lastReportWatts": 206, "maxReportWatts": 248 }, { "serialNumber": "121547059102", "lastReportDate": 1694554873, "devType": 1, "lastReportWatts": 159, "maxReportWatts": 247 }, { "serialNumber": "121547060590", "lastReportDate": 1694554881, "devType": 1, "lastReportWatts": 180, "maxReportWatts": 234 }, { "serialNumber": "121547060671", "lastReportDate": 1694554887, "devType": 1, "lastReportWatts": 60, "maxReportWatts": 224 }, { "serialNumber": "121547059354", "lastReportDate": 1694554892, "devType": 1, "lastReportWatts": 206, "maxReportWatts": 250 }, { "serialNumber": "121547059253", "lastReportDate": 1694554896, "devType": 1, "lastReportWatts": 202, "maxReportWatts": 249 }, { "serialNumber": "121547060392", "lastReportDate": 1694554895, "devType": 1, "lastReportWatts": 208, "maxReportWatts": 250 }, { "serialNumber": "121547059112", "lastReportDate": 1694554890, "devType": 1, "lastReportWatts": 200, "maxReportWatts": 248 }, { "serialNumber": "121547060647", "lastReportDate": 1694554890, "devType": 1, "lastReportWatts": 207, "maxReportWatts": 249 }, { "serialNumber": "121547060643", "lastReportDate": 1694554888, "devType": 1, "lastReportWatts": 200, "maxReportWatts": 248 }, { "serialNumber": "121547059217", "lastReportDate": 1694554886, "devType": 1, "lastReportWatts": 210, "maxReportWatts": 249 }, { "serialNumber": "121547055830", "lastReportDate": 1694554884, "devType": 1, "lastReportWatts": 201, "maxReportWatts": 247 }, { "serialNumber": "121547060592", "lastReportDate": 1694554881, "devType": 1, "lastReportWatts": 204, "maxReportWatts": 247 }, { "serialNumber": "121547060758", "lastReportDate": 1694554874, "devType": 1, "lastReportWatts": 197, "maxReportWatts": 240 }, { "serialNumber": "121547059333", "lastReportDate": 1694554877, "devType": 1, "lastReportWatts": 202, "maxReportWatts": 248 }, { "serialNumber": "121547060727", "lastReportDate": 1694554877, "devType": 1, "lastReportWatts": 204, "maxReportWatts": 249 }, { "serialNumber": "121547059008", "lastReportDate": 1694554837, "devType": 1, "lastReportWatts": 203, "maxReportWatts": 247 }, { "serialNumber": "121547060773", "lastReportDate": 1694554841, "devType": 1, "lastReportWatts": 202, "maxReportWatts": 246 }, { "serialNumber": "121547059202", "lastReportDate": 1694554848, "devType": 1, "lastReportWatts": 200, "maxReportWatts": 243 }, { "serialNumber": "121547060761", "lastReportDate": 1694554857, "devType": 1, "lastReportWatts": 202, "maxReportWatts": 244 }, { "serialNumber": "121547060412", "lastReportDate": 1694554855, "devType": 1, "lastReportWatts": 197, "maxReportWatts": 220 }, { "serialNumber": "121547059355", "lastReportDate": 1694554861, "devType": 1, "lastReportWatts": 207, "maxReportWatts": 249 }, { "serialNumber": "121547060415", "lastReportDate": 1694554866, "devType": 1, "lastReportWatts": 205, "maxReportWatts": 249 }, { "serialNumber": "121547060670", "lastReportDate": 1694554870, "devType": 1, "lastReportWatts": 199, "maxReportWatts": 243 }, { "serialNumber": "121547060396", "lastReportDate": 1694554867, "devType": 1, "lastReportWatts": 205, "maxReportWatts": 248 }, { "serialNumber": "121547059107", "lastReportDate": 1694554863, "devType": 1, "lastReportWatts": 204, "maxReportWatts": 247 }, { "serialNumber": "121547059889", "lastReportDate": 1694554862, "devType": 1, "lastReportWatts": 204, "maxReportWatts": 247 }, { "serialNumber": "121547060383", "lastReportDate": 1694554853, "devType": 1, "lastReportWatts": 204, "maxReportWatts": 246 }, { "serialNumber": "121547060766", "lastReportDate": 1694554837, "devType": 1, "lastReportWatts": 202, "maxReportWatts": 244 }, { "serialNumber": "121547059359", "lastReportDate": 1694554843, "devType": 1, "lastReportWatts": 205, "maxReportWatts": 249 }, { "serialNumber": "121547059357", "lastReportDate": 1694554850, "devType": 1, "lastReportWatts": 201, "maxReportWatts": 242 }, { "serialNumber": "121547059381", "lastReportDate": 1694554856, "devType": 1, "lastReportWatts": 205, "maxReportWatts": 249 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/api_v1_production_inverters_log.json000066400000000000000000000002701464551303400313020ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:24 GMT, Tue, 12 Sep 2023 21:55:24 GMT", "connection": "close", "content-type": "application/json", "content-length": "6042"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/api_v1_production_log.json000066400000000000000000000002671464551303400272070ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:24 GMT, Tue, 12 Sep 2023 21:55:24 GMT", "connection": "close", "content-type": "application/json", "content-length": "116"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/info000066400000000000000000000034211464551303400226770ustar00rootroot00000000000000 121621012167 800-00551-r02 D5.0.62 4c8675 0 1 false 500-00001-r01 02.00.00 953 500-00011-r01 04.01.15 8f3564 590-00018-r01 02.00.01 426697 500-00002-r01 05.00.62 5e57a9 500-00004-r01 01.02.346 b1b724 500-00008-r01 02.01.22 2faa48 500-00010-r01 05.00.02 4fe435 500-00013-r01 03.02.07 276642 500-00012-r01 02.02.00 a81a58 500-00016-r01 02.00.00 54a6dc 500-00001-r01 02.00.00 953 jenkins-envoy_uber-pkg_5.0-build:pkg-Jul-14-21-16:11:44 1626297189 pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/info_log.json000066400000000000000000000003241464551303400245070ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:24 GMT", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "connection": "close", "content-type": "text/xml", "content-length": "1809"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ensemble_dry_contacts000066400000000000000000000000401464551303400271620ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ensemble_dry_contacts_log.json000066400000000000000000000002531464551303400310010ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:25 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ensemble_generator000066400000000000000000000000401464551303400264540ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ensemble_generator_log.json000066400000000000000000000002531464551303400302730ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:26 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ensemble_inventory000066400000000000000000000000401464551303400265230ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ensemble_inventory_log.json000066400000000000000000000002531464551303400303420ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:25 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ensemble_power000066400000000000000000000000401464551303400256220ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ensemble_power_log.json000066400000000000000000000002531464551303400274410ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:25 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ensemble_secctrl000066400000000000000000000000401464551303400261250ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ensemble_secctrl_log.json000066400000000000000000000002531464551303400277440ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:25 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ensemble_status000066400000000000000000000000401464551303400260110ustar00rootroot00000000000000{ "error" : "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ensemble_status_log.json000066400000000000000000000002531464551303400276300ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:25 GMT", "connection": "close", "content-type": "application/json; charset=ISO-8859-4", "content-length": "31"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_meters000066400000000000000000000000031464551303400241120ustar00rootroot00000000000000[] pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_meters_log.json000066400000000000000000000001621464551303400257310ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:26 GMT", "connection": "close", "content-length": "2"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_meters_readings000066400000000000000000000000031464551303400257660ustar00rootroot00000000000000[] pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_meters_readings_log.json000066400000000000000000000001621464551303400276050ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:26 GMT", "connection": "close", "content-length": "2"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_sc_pvlimit000066400000000000000000000000361464551303400247720ustar00rootroot00000000000000 { "err": "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_sc_pvlimit_log.json000066400000000000000000000001631464551303400266040ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:26 GMT", "connection": "close", "content-length": "29"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ss_dry_contact_settings000066400000000000000000000000361464551303400275570ustar00rootroot00000000000000 { "err": "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ss_dry_contact_settings_log.json000066400000000000000000000001631464551303400313710ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:25 GMT", "connection": "close", "content-length": "29"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ss_gen_config000066400000000000000000000000361464551303400254240ustar00rootroot00000000000000 { "err": "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ss_gen_config_log.json000066400000000000000000000001631464551303400272360ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:26 GMT", "connection": "close", "content-length": "29"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ss_gen_schedule000066400000000000000000000000361464551303400257530ustar00rootroot00000000000000 { "err": "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ss_gen_schedule_log.json000066400000000000000000000001631464551303400275650ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:26 GMT", "connection": "close", "content-length": "29"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ss_pel_settings000066400000000000000000000000361464551303400260260ustar00rootroot00000000000000 { "err": "404 - Not Found" } pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/ivp_ss_pel_settings_log.json000066400000000000000000000001631464551303400276400ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:26 GMT", "connection": "close", "content-length": "29"}, "code": 404} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/production000066400000000000000000000000641464551303400241320ustar00rootroot00000000000000

401 Unauthorized

pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/production.json000066400000000000000000000003201464551303400250750ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":40,"readingTime":1694554896,"wNow":7904,"whLifetime":133798554}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/production.json_log.json000066400000000000000000000003421464551303400267120ustar00rootroot00000000000000{"headers": {"date": "Tue, 12 Sep 2023 21:55:24 GMT", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "connection": "close", "content-type": "application/json", "transfer-encoding": "chunked"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/5.0.62/production_log.json000066400000000000000000000003271464551303400257450ustar00rootroot00000000000000{"headers": {"www-authenticate": "Digest qop=\"auth\", realm=\"enphaseenergy.com\", nonce=\"Td4AZZWMIuPzNdOwn+N1MAFCm9k=\"", "connection": "close", "content-type": "text/html", "content-length": "51"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130/000077500000000000000000000000001464551303400221025ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130/api_v1_production000066400000000000000000000001661464551303400254550ustar00rootroot00000000000000{ "wattHoursLifetime" : 3659478, "wattHoursSevenDays" : 149944, "wattHoursToday" : 58, "wattsNow" : 133 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130/api_v1_production_inverters000066400000000000000000000037241464551303400275610ustar00rootroot00000000000000[ { "devType" : 1, "lastReportDate" : 1691342432, "lastReportWatts" : 13, "maxReportWatts" : 347, "serialNumber" : "202218036214" }, { "devType" : 1, "lastReportDate" : 1691342462, "lastReportWatts" : 17, "maxReportWatts" : 346, "serialNumber" : "202218028926" }, { "devType" : 1, "lastReportDate" : 1691342643, "lastReportWatts" : 12, "maxReportWatts" : 347, "serialNumber" : "202218029586" }, { "devType" : 1, "lastReportDate" : 1691342613, "lastReportWatts" : 17, "maxReportWatts" : 348, "serialNumber" : "202218035988" }, { "devType" : 1, "lastReportDate" : 1691342553, "lastReportWatts" : 8, "maxReportWatts" : 345, "serialNumber" : "202218024705" }, { "devType" : 1, "lastReportDate" : 1691342554, "lastReportWatts" : 14, "maxReportWatts" : 346, "serialNumber" : "202218023114" }, { "devType" : 1, "lastReportDate" : 1691342525, "lastReportWatts" : 16, "maxReportWatts" : 348, "serialNumber" : "202218037990" }, { "devType" : 1, "lastReportDate" : 1691342555, "lastReportWatts" : 14, "maxReportWatts" : 345, "serialNumber" : "202218034002" }, { "devType" : 1, "lastReportDate" : 1691342464, "lastReportWatts" : 9, "maxReportWatts" : 347, "serialNumber" : "202218026521" }, { "devType" : 1, "lastReportDate" : 1691342465, "lastReportWatts" : 10, "maxReportWatts" : 350, "serialNumber" : "202218025399" }, { "devType" : 1, "lastReportDate" : 1691342584, "lastReportWatts" : 9, "maxReportWatts" : 346, "serialNumber" : "202218036386" }, { "devType" : 1, "lastReportDate" : 1691342674, "lastReportWatts" : 20, "maxReportWatts" : 348, "serialNumber" : "202218031593" } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130/info000066400000000000000000000040071464551303400227610ustar00rootroot00000000000000 121729017746 800-00555-r03 D7.3.130 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 3eb4d3 590-00018-r01 02.00.01 426697 500-00002-r01 07.03.130 91f206 500-00004-r01 01.02.413 9c64cd 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 f9ead3 500-00012-r01 02.02.00 848ead 500-00016-r01 02.00.00 54a6dc 500-00020-r01 22.10.09 983d9b 500-00021-r01 01.00.00 19ae14 ec2-user-envoy_uber-pkg_master:pkg-Jun-22-23-21:46:51 1687470523 02.00.4240 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130/ivp_ensemble_inventory000066400000000000000000000000031464551303400266030ustar00rootroot00000000000000[] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130/production000066400000000000000000000045351464551303400242220ustar00rootroot00000000000000{ "consumption" : [ { "activeCount" : 1, "apprntPwr" : 5237.703, "measurementType" : "total-consumption", "pwrFactor" : 0.28, "reactPwr" : -1563.916, "readingTime" : 1691342720, "rmsCurrent" : 21.708, "rmsVoltage" : 241.282, "type" : "eim", "vahLifetime" : 14686272.679, "vahToday" : 22487.679, "varhLagLifetime" : 998203.693, "varhLagToday" : 1456.693, "varhLeadLifetime" : 10691668.261, "varhLeadToday" : 13985.261, "wNow" : 1487.654, "whLastSevenDays" : 365477.252, "whLifetime" : 10154384.252, "whToday" : 15181.252 }, { "activeCount" : 1, "apprntPwr" : 2179.847, "measurementType" : "net-consumption", "pwrFactor" : 0.61, "reactPwr" : -1595.09, "readingTime" : 1691342720, "rmsCurrent" : 18.131, "rmsVoltage" : 241.257, "type" : "eim", "vahLifetime" : 14686272.679, "vahToday" : 0, "varhLagLifetime" : 258967.196, "varhLagToday" : 0, "varhLeadLifetime" : 10652521.7, "varhLeadToday" : 0, "wNow" : 1307.413, "whLastSevenDays" : 0, "whLifetime" : 7116678.51, "whToday" : 0 } ], "production" : [ { "activeCount" : 12, "readingTime" : 1691342674, "type" : "inverters", "wNow" : 158, "whLifetime" : 142373 }, { "activeCount" : 1, "apprntPwr" : 430.612, "measurementType" : "production", "pwrFactor" : 0.44, "reactPwr" : -31.173, "readingTime" : 1691342720, "rmsCurrent" : 3.577, "rmsVoltage" : 241.307, "type" : "eim", "vahLifetime" : 4846261.636, "vahToday" : 1978.636, "varhLagLifetime" : 739236.497, "varhLagToday" : 1457.497, "varhLeadLifetime" : 39146.561, "varhLeadToday" : 40.561, "wNow" : 180.24, "whLastSevenDays" : 149972.523, "whLifetime" : 3659506.523, "whToday" : 86.523 } ], "storage" : [ { "activeCount" : 0, "readingTime" : 0, "state" : "idle", "type" : "acb", "wNow" : 0, "whNow" : 0 } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130/production.json000066400000000000000000000040611464551303400251640ustar00rootroot00000000000000{ "consumption": [ { "activeCount": 1, "apprntPwr": 5108.445, "measurementType": "total-consumption", "pwrFactor": 0.27, "reactPwr": -1565.844, "readingTime": 1691342712, "rmsCurrent": 21.153, "rmsVoltage": 241.499, "type": "eim", "vahLifetime": 14686267.589, "vahToday": 22482.589, "varhLagLifetime": 998203.693, "varhLagToday": 1456.693, "varhLeadLifetime": 10691664.429, "varhLeadToday": 13981.429, "wNow": 1393.191, "whLastSevenDays": 365473.825, "whLifetime": 10154380.825, "whToday": 15177.825 }, { "activeCount": 1, "apprntPwr": 2118.15, "measurementType": "net-consumption", "pwrFactor": 0.59, "reactPwr": -1596.082, "readingTime": 1691342712, "rmsCurrent": 17.572, "rmsVoltage": 241.437, "type": "eim", "vahLifetime": 14686267.589, "vahToday": 0, "varhLagLifetime": 258967.196, "varhLagToday": 0, "varhLeadLifetime": 10652517.939, "varhLeadToday": 0, "wNow": 1214.696, "whLastSevenDays": 0, "whLifetime": 7116675.502, "whToday": 0 } ], "production": [ { "activeCount": 12, "readingTime": 1691342674, "type": "inverters", "wNow": 158, "whLifetime": 142373 }, { "activeCount": 1, "apprntPwr": 432.848, "measurementType": "production", "pwrFactor": 0.41, "reactPwr": -30.238, "readingTime": 1691342712, "rmsCurrent": 3.581, "rmsVoltage": 241.56, "type": "eim", "vahLifetime": 4846260.619, "vahToday": 1977.619, "varhLagLifetime": 739236.497, "varhLagToday": 1457.497, "varhLeadLifetime": 39146.49, "varhLeadToday": 40.49, "wNow": 178.495, "whLastSevenDays": 149972.105, "whLifetime": 3659506.105, "whToday": 86.105 } ], "storage": [ { "activeCount": 0, "readingTime": 0, "state": "idle", "type": "acb", "wNow": 0, "whNow": 0 } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/000077500000000000000000000000001464551303400252345ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/admin_lib_tariff000066400000000000000000000030471464551303400304340ustar00rootroot00000000000000{"tariff":{"currency":{"code":"USD"},"logger":"mylogger","date":"1680547193","storage_settings":{"mode":"self-consumption","operation_mode_sub_type":"","reserved_soc":0.0,"very_low_soc":5,"charge_from_grid":false,"date":"1680547193"},"single_rate":{"rate":0.15128,"sell":0.0},"seasons":[{"id":"season_1","start":"1/1","days":[],"tiers":[{"id":"tier_1","limit":1000,"rate":0.15128},{"id":"tier_2","limit":-1,"rate":0.1585}]}],"seasons_sell":[]},"schedule":{"source":"Tariff","date":"2023-07-09 22:07:02 UTC","version":"00.00.02","reserved_soc":0.0,"operation_mode_sub_type":"","very_low_soc":5,"charge_from_grid":false,"battery_mode":"self-consumption","schedule":{"Disable":[{"Sun":[{"start":0,"duration":1440,"setting":"ID"}]},{"Mon":[{"start":0,"duration":1440,"setting":"ID"}]},{"Tue":[{"start":0,"duration":1440,"setting":"ID"}]},{"Wed":[{"start":0,"duration":1440,"setting":"ID"}]},{"Thu":[{"start":0,"duration":1440,"setting":"ID"}]},{"Fri":[{"start":0,"duration":1440,"setting":"ID"}]},{"Sat":[{"start":0,"duration":1440,"setting":"ID"}]}],"tariff":[{"start":"1/1","end":"1/1","Sun":[{"start":0,"duration":1440,"setting":"ZN"}],"Mon":[{"start":0,"duration":1440,"setting":"ZN"}],"Tue":[{"start":0,"duration":1440,"setting":"ZN"}],"Wed":[{"start":0,"duration":1440,"setting":"ZN"}],"Thu":[{"start":0,"duration":1440,"setting":"ZN"}],"Fri":[{"start":0,"duration":1440,"setting":"ZN"}],"Sat":[{"start":0,"duration":1440,"setting":"ZN"}]}]},"override":false,"override_backup_soc":30.0,"override_chg_dischg_rate":0.0,"override_tou_mode":"StorageTouMode_DEFAULT_TOU_MODE"}} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/admin_lib_tariff_log.json000066400000000000000000000006131464551303400322410ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:33 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/api_v1_production000066400000000000000000000001621464551303400306030ustar00rootroot00000000000000{ "wattHoursToday": 14498, "wattHoursSevenDays": 185978, "wattHoursLifetime": 4545576, "wattsNow": 4454 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/api_v1_production_inverters000066400000000000000000000043341464551303400327110ustar00rootroot00000000000000[ { "serialNumber": "202302073177", "lastReportDate": 1694549622, "devType": 1, "lastReportWatts": 271, "maxReportWatts": 299 }, { "serialNumber": "202302072076", "lastReportDate": 1694549623, "devType": 1, "lastReportWatts": 271, "maxReportWatts": 300 }, { "serialNumber": "202302073203", "lastReportDate": 1694549592, "devType": 1, "lastReportWatts": 276, "maxReportWatts": 301 }, { "serialNumber": "202302075515", "lastReportDate": 1694549531, "devType": 1, "lastReportWatts": 284, "maxReportWatts": 300 }, { "serialNumber": "482236040746", "lastReportDate": 1694549624, "devType": 1, "lastReportWatts": 270, "maxReportWatts": 300 }, { "serialNumber": "202302076392", "lastReportDate": 1694549625, "devType": 1, "lastReportWatts": 271, "maxReportWatts": 301 }, { "serialNumber": "202302077506", "lastReportDate": 1694549561, "devType": 1, "lastReportWatts": 283, "maxReportWatts": 300 }, { "serialNumber": "202302077015", "lastReportDate": 1694549626, "devType": 1, "lastReportWatts": 269, "maxReportWatts": 300 }, { "serialNumber": "202302076838", "lastReportDate": 1694549652, "devType": 1, "lastReportWatts": 266, "maxReportWatts": 300 }, { "serialNumber": "482236040258", "lastReportDate": 1694549627, "devType": 1, "lastReportWatts": 273, "maxReportWatts": 300 }, { "serialNumber": "202302077890", "lastReportDate": 1694549594, "devType": 1, "lastReportWatts": 276, "maxReportWatts": 300 }, { "serialNumber": "202302074252", "lastReportDate": 1694549653, "devType": 1, "lastReportWatts": 269, "maxReportWatts": 300 }, { "serialNumber": "202302077415", "lastReportDate": 1694549654, "devType": 1, "lastReportWatts": 266, "maxReportWatts": 300 }, { "serialNumber": "482236040239", "lastReportDate": 1694549628, "devType": 1, "lastReportWatts": 272, "maxReportWatts": 300 }, { "serialNumber": "202302073606", "lastReportDate": 1694549655, "devType": 1, "lastReportWatts": 269, "maxReportWatts": 300 } ] api_v1_production_inverters_log.json000066400000000000000000000005021464551303400344340ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:30 GMT", "content-type": "application/json", "content-length": "2268", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/api_v1_production_log.json000066400000000000000000000005011464551303400324110ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:30 GMT", "content-type": "application/json", "content-length": "114", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/info000066400000000000000000000041771464551303400261230ustar00rootroot00000000000000 202305058594 800-00647-r10 D7.3.130 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 3eb4d3 590-00019-r01 02.00.01 1f421b 500-00002-r01 07.03.130 91f206 500-00004-r01 01.02.413 9c64cd 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 f9ead3 500-00012-r01 02.02.00 848ead 500-00020-r01 22.10.09 983d9b 500-00016-r01 02.00.00 54a6dc 500-00021-r01 01.00.00 19ae14 500-00001-r01 02.00.00 1210 ec2-user-envoy_uber-pkg_master:pkg-Jun-22-23-21:46:51 1687470523 02.00.4240 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/info_log.json000066400000000000000000000005751464551303400277320ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:29 GMT", "content-type": "text/xml", "content-length": "2175", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ensemble_dry_contacts000066400000000000000000000010531464551303400324020ustar00rootroot00000000000000 401 Authorization Required

401 Authorization Required


Redirecting to
pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ensemble_dry_contacts_log.json000066400000000000000000000002661464551303400342200ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:32 GMT", "content-type": "text/html", "content-length": "555", "connection": "keep-alive"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ensemble_generator000066400000000000000000000010531464551303400316740ustar00rootroot00000000000000 401 Authorization Required

401 Authorization Required


Redirecting to
pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ensemble_generator_log.json000066400000000000000000000002661464551303400335120ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:33 GMT", "content-type": "text/html", "content-length": "555", "connection": "keep-alive"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ensemble_inventory000066400000000000000000000000031464551303400317350ustar00rootroot00000000000000[] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ensemble_inventory_log.json000066400000000000000000000004331464551303400335550ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:32 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ensemble_power000066400000000000000000000010531464551303400310420ustar00rootroot00000000000000 401 Authorization Required

401 Authorization Required


Redirecting to
pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ensemble_power_log.json000066400000000000000000000002661464551303400326600ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:32 GMT", "content-type": "text/html", "content-length": "555", "connection": "keep-alive"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ensemble_secctrl000066400000000000000000000010531464551303400313450ustar00rootroot00000000000000 401 Authorization Required

401 Authorization Required


Redirecting to
pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ensemble_secctrl_log.json000066400000000000000000000002661464551303400331630ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:32 GMT", "content-type": "text/html", "content-length": "555", "connection": "keep-alive"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ensemble_status000066400000000000000000000010531464551303400312310ustar00rootroot00000000000000 401 Authorization Required

401 Authorization Required


Redirecting to
pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ensemble_status_log.json000066400000000000000000000002661464551303400330470ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:32 GMT", "content-type": "text/html", "content-length": "555", "connection": "keep-alive"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_meters000066400000000000000000000007131464551303400273350ustar00rootroot00000000000000[ { "eid": 704643328, "state": "enabled", "measurementType": "production", "phaseMode": "split", "phaseCount": 2, "meteringStatus": "normal", "statusFlags": [] }, { "eid": 704643584, "state": "disabled", "measurementType": "net-consumption", "phaseMode": "split", "phaseCount": 2, "meteringStatus": "normal", "statusFlags": [] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_meters_log.json000066400000000000000000000004351464551303400311470ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:33 GMT", "content-length": "458", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_meters_readings000066400000000000000000000112461464551303400312140ustar00rootroot00000000000000[ { "eid": 704643328, "timestamp": 1694549733, "actEnergyDlvd": 4545929.530, "actEnergyRcvd": 0.637, "apparentEnergy": 5375938.331, "reactEnergyLagg": 730001.916, "reactEnergyLead": 16050.589, "instantaneousDemand": 3624.573, "activePower": 3624.573, "apparentPower": 3675.535, "reactivePower": 25.544, "pwrFactor": 0.988, "voltage": 241.696, "current": 30.223, "freq": 60.000, "channels": [ { "eid": 1778385169, "timestamp": 1694549733, "actEnergyDlvd": 2271793.630, "actEnergyRcvd": 0.300, "apparentEnergy": 2685521.244, "reactEnergyLagg": 365648.234, "reactEnergyLead": 7490.926, "instantaneousDemand": 1810.773, "activePower": 1810.773, "apparentPower": 1836.021, "reactivePower": 13.171, "pwrFactor": 0.988, "voltage": 120.749, "current": 15.110, "freq": 60.000 }, { "eid": 1778385170, "timestamp": 1694549733, "actEnergyDlvd": 2274135.900, "actEnergyRcvd": 0.337, "apparentEnergy": 2690417.087, "reactEnergyLagg": 364353.682, "reactEnergyLead": 8559.662, "instantaneousDemand": 1813.800, "activePower": 1813.800, "apparentPower": 1839.514, "reactivePower": 12.373, "pwrFactor": 0.988, "voltage": 120.946, "current": 15.113, "freq": 60.000 }, { "eid": 1778385171, "timestamp": 1694549733, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 0.000, "current": 0.000, "freq": 60.000 } ] }, { "eid": 704643584, "timestamp": 1694549733, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.021, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 34.651, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 241.718, "current": 0.287, "freq": 60.000, "channels": [ { "eid": 1778385425, "timestamp": 1694549733, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.009, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 15.201, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 120.773, "current": 0.126, "freq": 60.000 }, { "eid": 1778385426, "timestamp": 1694549733, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.012, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 19.450, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 120.945, "current": 0.160, "freq": 60.000 }, { "eid": 1778385427, "timestamp": 1694549733, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 0.000, "current": 0.000, "freq": 60.000 } ] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_meters_readings_log.json000066400000000000000000000004361464551303400330240ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:33 GMT", "content-length": "4773", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_sc_pvlimit000066400000000000000000000010531464551303400302050ustar00rootroot00000000000000 401 Authorization Required

401 Authorization Required


Redirecting to
pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_sc_pvlimit_log.json000066400000000000000000000002661464551303400320230ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:33 GMT", "content-type": "text/html", "content-length": "555", "connection": "keep-alive"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ss_dry_contact_settings000066400000000000000000000010531464551303400327720ustar00rootroot00000000000000 401 Authorization Required

401 Authorization Required


Redirecting to
ivp_ss_dry_contact_settings_log.json000066400000000000000000000002661464551303400345310ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:32 GMT", "content-type": "text/html", "content-length": "555", "connection": "keep-alive"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ss_gen_config000066400000000000000000000010531464551303400306370ustar00rootroot00000000000000 401 Authorization Required

401 Authorization Required


Redirecting to
pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ss_gen_config_log.json000066400000000000000000000002661464551303400324550ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:33 GMT", "content-type": "text/html", "content-length": "555", "connection": "keep-alive"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ss_gen_schedule000066400000000000000000000010531464551303400311660ustar00rootroot00000000000000 401 Authorization Required

401 Authorization Required


Redirecting to
pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ss_gen_schedule_log.json000066400000000000000000000002661464551303400330040ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:33 GMT", "content-type": "text/html", "content-length": "555", "connection": "keep-alive"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ss_pel_settings000066400000000000000000000010531464551303400312410ustar00rootroot00000000000000 401 Authorization Required

401 Authorization Required


Redirecting to
pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/ivp_ss_pel_settings_log.json000066400000000000000000000002661464551303400330570ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:33 GMT", "content-type": "text/html", "content-length": "555", "connection": "keep-alive"}, "code": 401} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/production000066400000000000000000000026341464551303400273520ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":15,"readingTime":1694549655,"wNow":4085,"whLifetime":943236},{"type":"eim","activeCount":1,"measurementType":"production","readingTime":1694549732,"wNow":3731.248,"whLifetime":4545927.529,"varhLeadLifetime":16050.589,"varhLagLifetime":730001.903,"vahLifetime":5375936.301,"rmsCurrent":31.056,"rmsVoltage":241.728,"reactPwr":28.835,"apprntPwr":3779.803,"pwrFactor":0.99,"whToday":14849.529,"whLastSevenDays":186011.529,"vahToday":17700.301,"varhLeadToday":14.589,"varhLagToday":2831.903}],"consumption":[{"type":"eim","activeCount":0,"measurementType":"total-consumption","readingTime":1694549732,"wNow":3731.248,"whLifetime":4545910.343,"varhLeadLifetime":16050.589,"varhLagLifetime":730001.903,"vahLifetime":0.021,"rmsCurrent":31.345,"rmsVoltage":241.767,"reactPwr":-27.926,"apprntPwr":7578.065,"pwrFactor":0.49,"whToday":4545910.343,"whLastSevenDays":4545910.343,"vahToday":0.021,"varhLeadToday":16050.589,"varhLagToday":730001.903},{"type":"eim","activeCount":0,"measurementType":"net-consumption","readingTime":1694549732,"wNow":0.0,"whLifetime":0.0,"varhLeadLifetime":0.0,"varhLagLifetime":0.0,"vahLifetime":0.021,"rmsCurrent":0.289,"rmsVoltage":241.805,"reactPwr":0.909,"apprntPwr":34.907,"pwrFactor":0.0,"whToday":0,"whLastSevenDays":0,"vahToday":0,"varhLeadToday":0,"varhLagToday":0}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/production.json000066400000000000000000000026301464551303400303160ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":15,"readingTime":1694549655,"wNow":4085,"whLifetime":943236},{"type":"eim","activeCount":1,"measurementType":"production","readingTime":1694549731,"wNow":3780.646,"whLifetime":4545926.403,"varhLeadLifetime":16050.589,"varhLagLifetime":730001.895,"vahLifetime":5375935.161,"rmsCurrent":31.541,"rmsVoltage":241.801,"reactPwr":30.203,"apprntPwr":3826.518,"pwrFactor":0.99,"whToday":14848.403,"whLastSevenDays":186010.403,"vahToday":17699.161,"varhLeadToday":14.589,"varhLagToday":2831.895}],"consumption":[{"type":"eim","activeCount":0,"measurementType":"total-consumption","readingTime":1694549731,"wNow":3780.646,"whLifetime":4545909.217,"varhLeadLifetime":16050.589,"varhLagLifetime":730001.895,"vahLifetime":0.021,"rmsCurrent":31.831,"rmsVoltage":241.85,"reactPwr":-29.295,"apprntPwr":7698.231,"pwrFactor":0.49,"whToday":4545909.217,"whLastSevenDays":4545909.217,"vahToday":0.021,"varhLeadToday":16050.589,"varhLagToday":730001.895},{"type":"eim","activeCount":0,"measurementType":"net-consumption","readingTime":1694549731,"wNow":0.0,"whLifetime":0.0,"varhLeadLifetime":0.0,"varhLagLifetime":0.0,"vahLifetime":0.021,"rmsCurrent":0.29,"rmsVoltage":241.9,"reactPwr":0.909,"apprntPwr":35.041,"pwrFactor":0.0,"whToday":0,"whLastSevenDays":0,"vahToday":0,"varhLeadToday":0,"varhLagToday":0}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/production.json_log.json000066400000000000000000000006131464551303400321260ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:31 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.130_no_consumption/production_log.json000066400000000000000000000006131464551303400311560ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 20:15:32 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/000077500000000000000000000000001464551303400263235ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/admin_lib_tariff000066400000000000000000000033221464551303400315170ustar00rootroot00000000000000{"tariff":{"currency":{"code":"EUR"},"logger":"mylogger","date":"1688053811","storage_settings":{"mode":"self-consumption","operation_mode_sub_type":"","reserved_soc":0.0,"very_low_soc":5,"charge_from_grid":false,"date":"1688053811"},"single_rate":{"rate":0.01,"sell":0.0},"seasons":[{"id":"all_year_long","start":"1/1","days":[{"id":"all_days","days":"Mon,Tue,Wed,Thu,Fri,Sat,Sun","must_charge_start":0,"must_charge_duration":0,"must_charge_mode":"CG","enable_discharge_to_grid":false,"periods":[{"id":"period_1","start":480,"rate":0.14},{"id":"filler","start":1320,"rate":0.01}]}],"tiers":[]}],"seasons_sell":[]},"schedule":{"source":"Tariff","date":"2023-06-29 15:50:12 UTC","version":"00.00.02","reserved_soc":0.0,"operation_mode_sub_type":"","very_low_soc":5,"charge_from_grid":false,"battery_mode":"self-consumption","schedule":{"Disable":[{"Sun":[{"start":0,"duration":1440,"setting":"ID"}]},{"Mon":[{"start":0,"duration":1440,"setting":"ID"}]},{"Tue":[{"start":0,"duration":1440,"setting":"ID"}]},{"Wed":[{"start":0,"duration":1440,"setting":"ID"}]},{"Thu":[{"start":0,"duration":1440,"setting":"ID"}]},{"Fri":[{"start":0,"duration":1440,"setting":"ID"}]},{"Sat":[{"start":0,"duration":1440,"setting":"ID"}]}],"tariff":[{"start":"1/1","end":"1/1","Sun":[{"start":0,"duration":1440,"setting":"ZN"}],"Mon":[{"start":0,"duration":1440,"setting":"ZN"}],"Tue":[{"start":0,"duration":1440,"setting":"ZN"}],"Wed":[{"start":0,"duration":1440,"setting":"ZN"}],"Thu":[{"start":0,"duration":1440,"setting":"ZN"}],"Fri":[{"start":0,"duration":1440,"setting":"ZN"}],"Sat":[{"start":0,"duration":1440,"setting":"ZN"}]}]},"override":false,"override_backup_soc":30.0,"override_chg_dischg_rate":0.0,"override_tou_mode":"StorageTouMode_DEFAULT_TOU_MODE"}} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/admin_lib_tariff_log.json000066400000000000000000000006131464551303400333300ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/api_v1_production000066400000000000000000000001421464551303400316700ustar00rootroot00000000000000{ "wattHoursToday": 0, "wattHoursSevenDays": 0, "wattHoursLifetime": 0, "wattsNow": 689 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/api_v1_production_inverters000066400000000000000000000020421464551303400337720ustar00rootroot00000000000000[ { "serialNumber": "121823030072", "lastReportDate": 1693745036, "devType": 1, "lastReportWatts": 58, "maxReportWatts": 253 }, { "serialNumber": "121823035149", "lastReportDate": 1693745066, "devType": 1, "lastReportWatts": 56, "maxReportWatts": 254 }, { "serialNumber": "482243031579", "lastReportDate": 1693744825, "devType": 1, "lastReportWatts": 135, "maxReportWatts": 365 }, { "serialNumber": "482243032888", "lastReportDate": 1693744828, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 365 }, { "serialNumber": "482250079070", "lastReportDate": 1693744828, "devType": 1, "lastReportWatts": 130, "maxReportWatts": 365 }, { "serialNumber": "482243033444", "lastReportDate": 1693744829, "devType": 1, "lastReportWatts": 127, "maxReportWatts": 365 }, { "serialNumber": "482243032889", "lastReportDate": 1693744946, "devType": 1, "lastReportWatts": 112, "maxReportWatts": 365 } ] api_v1_production_inverters_log.json000066400000000000000000000005021464551303400355230ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:27 GMT", "content-type": "application/json", "content-length": "1058", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/api_v1_production_log.json000066400000000000000000000005011464551303400335000ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:27 GMT", "content-type": "application/json", "content-length": "112", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/info000066400000000000000000000041771464551303400272120ustar00rootroot00000000000000 122238082763 800-00654-r08 D7.3.466 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 3eb4d3 590-00019-r01 02.00.01 1f421b 500-00002-r01 07.06.175 f79c8d 500-00005-r01 01.02.371 373aab 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 eaa252 500-00012-r01 02.02.00 40061a 500-00020-r01 21.19.82 667fd7 500-00016-r01 02.00.00 54a6dc 500-00021-r01 01.00.00 19ae14 500-00001-r01 02.00.00 1210 ec2-user-envoy_uber-pkg_master:pkg-Jun-22-23-18:55:22 1687460237 02.00.4238 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/info_log.json000066400000000000000000000005751464551303400310210ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:27 GMT", "content-type": "text/xml", "content-length": "2175", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ensemble_dry_contacts000066400000000000000000000005131464551303400334710ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "open" }, { "id": "NC2", "status": "open" }, { "id": "NO1", "status": "open" }, { "id": "NO2", "status": "open" } ] } ivp_ensemble_dry_contacts_log.json000066400000000000000000000004351464551303400352260ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "330", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ensemble_generator000066400000000000000000000002771464551303400327720ustar00rootroot00000000000000{ "admin_state": "unknown", "oper_state": "open", "admin_mode": 0, "schedule": 0, "start_soc": 100, "stop_soc": -1, "exc_on": 0, "present": 1, "type": 0 } ivp_ensemble_generator_log.json000066400000000000000000000004351464551303400345200ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "190", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ensemble_inventory000066400000000000000000000000031464551303400330240ustar00rootroot00000000000000[] ivp_ensemble_inventory_log.json000066400000000000000000000004331464551303400345650ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ensemble_power000066400000000000000000000000271464551303400321310ustar00rootroot00000000000000{ "devices:": [] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ensemble_power_log.json000066400000000000000000000004341464551303400337440ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "22", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ensemble_secctrl000066400000000000000000000013301464551303400324320ustar00rootroot00000000000000{ "shutdown": false, "freq_bias_hz": 0.0, "voltage_bias_v": 0.0, "freq_bias_hz_q8": 0, "voltage_bias_v_q5": 0, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 0, "adjusted_backup_soc": 0, "agg_soc": 0, "Max_energy": 0, "ENC_agg_soc": 0, "ENC_agg_soh": 0, "ENC_agg_backup_energy": 0, "ENC_agg_avail_energy": 0, "Enc_commissioned_capacity": 0, "Enc_max_available_capacity": 0, "ACB_agg_soc": 0, "ACB_agg_energy": 0 } ivp_ensemble_secctrl_log.json000066400000000000000000000004351464551303400341710ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "727", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ensemble_status000066400000000000000000000045621464551303400323300ustar00rootroot00000000000000{ "inventory": { "serial_nums": {} }, "counters": { "api_ecagtInit": 1, "api_ecagtTick": 6254765, "api_ecagtGetDeviceCount": 6321456, "api_ecagtGetDeviceInfo": 6281617, "api_ecagtSetSecCtrlBias": 564094, "api_ecagtGetSecCtrlBias": 38, "api_ecagtGetSecCtrlBiasQ": 38, "api_ecagtGetRelayState": 7505737, "api_ecagtSetDataModelCache": 1, "api_AggNameplate": 19, "api_ecagtGetGridFreq": 1250953, "api_ecagtGetGridVolt": 1250953, "api_ecagtGetGridFreq_err_notfound": 1250953, "rest_StatusGet": 20, "rest_InventoryGet": 26915, "rest_SubmodGet": 11141, "rest_SecCtrlGet": 19, "rest_CommCheckGet": 26851, "rest_Power": 1, "ext_zb_send_msg": 564094, "txmsg_OBJ_MDL_SECONDARY_CTRL_REQ": 564094, "zmq_ecaHello": 1, "zmq_streamdata": 1250953, "zmq_eca_live_debug_req": 4, "zmq_ecaSecCtrlMsg": 564094, "zmq_meterlog_ok": 1, "dmdl_FILES_INDEXED": 3, "backupSocLimitSet": 564094, "backupSocLimitChanged": 2, "api_ecagtGetGenRelayState": 1250953 }, "secctrl": { "shutdown": false, "freq_bias_hz": 0.0, "voltage_bias_v": 0.0, "freq_bias_hz_q8": 0, "voltage_bias_v_q5": 0, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 0, "adjusted_backup_soc": 0, "agg_soc": 0, "Max_energy": 0, "ENC_agg_soc": 0, "ENC_agg_soh": 0, "ENC_agg_backup_energy": 0, "ENC_agg_avail_energy": 0, "Enc_commissioned_capacity": 0, "Enc_max_available_capacity": 0, "ACB_agg_soc": 0, "ACB_agg_energy": 0 }, "relay": { "mains_admin_state": "closed", "mains_oper_state": "closed", "der1_state": 0, "der2_state": 0, "Enchg_grid_mode": "grid-tied", "Solar_grid_mode": "unknown" }, "profile": { "message": "Obsolete API, please use ivp/arf/profile" }, "fakeit": { "fake_inventory_mode": false } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ensemble_status_log.json000066400000000000000000000004361464551303400341350ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "2417", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_meters000066400000000000000000000007471464551303400304330ustar00rootroot00000000000000[ { "eid": 704643328, "state": "disabled", "measurementType": "production", "phaseMode": "three", "phaseCount": 1, "meteringStatus": "check-wiring", "statusFlags": ["negative-production"] }, { "eid": 704643584, "state": "disabled", "measurementType": "net-consumption", "phaseMode": "three", "phaseCount": 1, "meteringStatus": "normal", "statusFlags": [] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_meters_log.json000066400000000000000000000004351464551303400322360ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "457", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_meters_readings000066400000000000000000000113541464551303400323030ustar00rootroot00000000000000[ { "eid": 704643328, "timestamp": 1693745133, "actEnergyDlvd": 3183793.885, "actEnergyRcvd": 8851.704, "apparentEnergy": 3576167.385, "reactEnergyLagg": 591594.008, "reactEnergyLead": 0.021, "instantaneousDemand": 488.925, "activePower": 488.925, "apparentPower": 510.003, "reactivePower": 114.596, "pwrFactor": 0.957, "voltage": 235.236, "current": 2.169, "freq": 50.000, "channels": [ { "eid": 1778385169, "timestamp": 1693745133, "actEnergyDlvd": 3183793.885, "actEnergyRcvd": 8851.704, "apparentEnergy": 3576167.385, "reactEnergyLagg": 591594.008, "reactEnergyLead": 0.021, "instantaneousDemand": 488.925, "activePower": 488.925, "apparentPower": 510.003, "reactivePower": 114.596, "pwrFactor": 0.957, "voltage": 235.236, "current": 2.169, "freq": 50.000 }, { "eid": 1778385170, "timestamp": 1693745133, "actEnergyDlvd": 0.000, "actEnergyRcvd": 5370.790, "apparentEnergy": 295.364, "reactEnergyLagg": 387.143, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 6.124, "current": 0.000, "freq": 50.000 }, { "eid": 1778385171, "timestamp": 1693745133, "actEnergyDlvd": 0.022, "actEnergyRcvd": 9818.109, "apparentEnergy": 14032.684, "reactEnergyLagg": 391.775, "reactEnergyLead": 2.189, "instantaneousDemand": -1.044, "activePower": -1.044, "apparentPower": 2.602, "reactivePower": -0.000, "pwrFactor": -1.000, "voltage": 11.469, "current": 0.227, "freq": 50.000 } ] }, { "eid": 704643584, "timestamp": 1693745133, "actEnergyDlvd": 3738205.282, "actEnergyRcvd": 1776768.769, "apparentEnergy": 7252190.779, "reactEnergyLagg": 251.885, "reactEnergyLead": 3174027.145, "instantaneousDemand": -36.162, "activePower": -36.162, "apparentPower": 645.376, "reactivePower": -568.304, "pwrFactor": -0.060, "voltage": 235.201, "current": 2.745, "freq": 50.000, "channels": [ { "eid": 1778385425, "timestamp": 1693745133, "actEnergyDlvd": 3738205.282, "actEnergyRcvd": 1776768.769, "apparentEnergy": 7252190.779, "reactEnergyLagg": 251.885, "reactEnergyLead": 3174027.145, "instantaneousDemand": -36.162, "activePower": -36.162, "apparentPower": 645.376, "reactivePower": -568.304, "pwrFactor": -0.060, "voltage": 235.201, "current": 2.745, "freq": 50.000 }, { "eid": 1778385426, "timestamp": 1693745133, "actEnergyDlvd": 0.000, "actEnergyRcvd": 8279.267, "apparentEnergy": 141.429, "reactEnergyLagg": 378.426, "reactEnergyLead": 0.181, "instantaneousDemand": -0.000, "activePower": -0.000, "apparentPower": -0.000, "reactivePower": 0.000, "pwrFactor": -1.000, "voltage": 2.981, "current": 0.000, "freq": 50.000 }, { "eid": 1778385427, "timestamp": 1693745133, "actEnergyDlvd": 0.013, "actEnergyRcvd": 13980.174, "apparentEnergy": 6016.263, "reactEnergyLagg": 380.215, "reactEnergyLead": 1.245, "instantaneousDemand": -0.451, "activePower": -0.451, "apparentPower": 1.128, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 4.635, "current": 0.242, "freq": 50.000 } ] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_meters_readings_log.json000066400000000000000000000004361464551303400341130ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "4843", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_sc_pvlimit000066400000000000000000000000611464551303400312720ustar00rootroot00000000000000{ "enable": false, "pv_limit_pct": 100 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_sc_pvlimit_log.json000066400000000000000000000004341464551303400331070ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "48", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ss_dry_contact_settings000066400000000000000000000027271464551303400340720ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NC2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] } ] } ivp_ss_dry_contact_settings_log.json000066400000000000000000000004361464551303400356170ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "1494", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ss_gen_config000066400000000000000000000000031464551303400317200ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ss_gen_config_log.json000066400000000000000000000004331464551303400335400ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ss_gen_schedule000066400000000000000000000000031464551303400322470ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ss_gen_schedule_log.json000066400000000000000000000004331464551303400340670ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ss_pel_settings000066400000000000000000000000251464551303400323260ustar00rootroot00000000000000{ "PEL": false } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/ivp_ss_pel_settings_log.json000066400000000000000000000004341464551303400341430ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "20", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/production000066400000000000000000000047321464551303400304420ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 7, "readingTime": 1693745066, "wNow": 751, "whLifetime": 702919 }, { "type": "eim", "activeCount": 0, "measurementType": "production", "readingTime": 1693745131, "wNow": 487.903, "whLifetime": 3183793.452, "varhLeadLifetime": 0.021, "varhLagLifetime": 591593.906, "vahLifetime": 3576166.933, "rmsCurrent": 2.165, "rmsVoltage": 235.525, "reactPwr": 114.857, "apprntPwr": 509.895, "pwrFactor": 0.97, "whToday": 4425.452, "whLastSevenDays": 111093.452, "vahToday": 5461.933, "varhLeadToday": 0.021, "varhLagToday": 1483.906 } ], "consumption": [ { "type": "eim", "activeCount": 0, "measurementType": "total-consumption", "readingTime": 1693745131, "wNow": 473.765, "whLifetime": 5145153.764, "varhLeadLifetime": 3174026.62, "varhLagLifetime": -591342.021, "vahLifetime": 7252190.208, "rmsCurrent": -0.607, "rmsVoltage": 235.49, "reactPwr": -457.841, "apprntPwr": -142.942, "pwrFactor": 1, "whToday": 19903.764, "whLastSevenDays": 4.764, "vahToday": 22904.208, "varhLeadToday": 9602.62, "varhLagToday": 0 }, { "type": "eim", "activeCount": 0, "measurementType": "net-consumption", "readingTime": 1693745131, "wNow": -14.138, "whLifetime": 1961512.78, "varhLeadLifetime": 3174026.64, "varhLagLifetime": 251.885, "vahLifetime": 7252190.208, "rmsCurrent": -2.772, "rmsVoltage": 235.49, "reactPwr": -572.698, "apprntPwr": -652.719, "pwrFactor": -1, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/production.json000066400000000000000000000047461464551303400314170ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 7, "readingTime": 1693745066, "wNow": 751, "whLifetime": 702919 }, { "type": "eim", "activeCount": 0, "measurementType": "production", "readingTime": 1693745129, "wNow": 488.154, "whLifetime": 3183793.303, "varhLeadLifetime": 0.021, "varhLagLifetime": 591593.872, "vahLifetime": 3576166.777, "rmsCurrent": 2.162, "rmsVoltage": 235.777, "reactPwr": 115.849, "apprntPwr": 509.902, "pwrFactor": 0.97, "whToday": 4425.303, "whLastSevenDays": 111093.303, "vahToday": 5461.777, "varhLeadToday": 0.021, "varhLagToday": 1483.872 } ], "consumption": [ { "type": "eim", "activeCount": 0, "measurementType": "total-consumption", "readingTime": 1693745129, "wNow": 476.686, "whLifetime": 5145153.621, "varhLeadLifetime": 3174026.446, "varhLagLifetime": -591341.987, "vahLifetime": 7252190.009, "rmsCurrent": -0.615, "rmsVoltage": 235.743, "reactPwr": -456.848, "apprntPwr": -144.999, "pwrFactor": 1.0, "whToday": 19903.621, "whLastSevenDays": 4.621, "vahToday": 22904.009, "varhLeadToday": 9602.446, "varhLagToday": 0.0 }, { "type": "eim", "activeCount": 0, "measurementType": "net-consumption", "readingTime": 1693745129, "wNow": -11.468, "whLifetime": 1961512.786, "varhLeadLifetime": 3174026.466, "varhLagLifetime": 251.885, "vahLifetime": 7252190.009, "rmsCurrent": -2.778, "rmsVoltage": 235.743, "reactPwr": -572.697, "apprntPwr": -654.785, "pwrFactor": -1.0, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/production.json_log.json000066400000000000000000000006131464551303400332150ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:29 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_metered_disabled_cts/production_log.json000066400000000000000000000006131464551303400322450ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/000077500000000000000000000000001464551303400252655ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/_readme000066400000000000000000000014141464551303400266040ustar00rootroot000000000000007.3.466_with_cts_3phase UPDATE1: /production.json endpoint only provides phase details when passing parameter details=1 so /production file has phases removed while /production.json file has them included. ORIGINAL: Somewhere between fw 7.3.466 and 7.6.175 /production endpoint stopped reporting phase data for Envoy metered with CT and multi-phase (Split or Three). The (original) test fixture 7.6.175_with_cts_3phase includeded a /production endpoint file with phases included. This fixture set is build from a debug log for a 7.3.466 FW with elements from the original 7.6.175 added. Verified from a 7.3.466 debug log: - api_v1_production - api_v1_production_inverters - ivp_ensemble_inventory - ivp_meters_readings - ivp_meters_reports - production - production.json pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/admin_lib_tariff000066400000000000000000000131621464551303400304640ustar00rootroot00000000000000{ "tariff": { "currency": { "code": "EUR" }, "logger": "mylogger", "date": "1688053811", "storage_settings": { "mode": "self-consumption", "operation_mode_sub_type": "", "reserved_soc": 0, "very_low_soc": 5, "charge_from_grid": false, "date": "1688053811" }, "single_rate": { "rate": 0.01, "sell": 0 }, "seasons": [ { "id": "all_year_long", "start": "1/1", "days": [ { "id": "all_days", "days": "Mon,Tue,Wed,Thu,Fri,Sat,Sun", "must_charge_start": 0, "must_charge_duration": 0, "must_charge_mode": "CG", "enable_discharge_to_grid": false, "periods": [ { "id": "period_1", "start": 480, "rate": 0.14 }, { "id": "filler", "start": 1320, "rate": 0.01 } ] } ], "tiers": [] } ], "seasons_sell": [] }, "schedule": { "source": "Tariff", "date": "2023-06-29 15:50:12 UTC", "version": "00.00.02", "reserved_soc": 0, "operation_mode_sub_type": "", "very_low_soc": 5, "charge_from_grid": false, "battery_mode": "self-consumption", "schedule": { "Disable": [ { "Sun": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Mon": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Tue": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Wed": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Thu": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Fri": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Sat": [ { "start": 0, "duration": 1440, "setting": "ID" } ] } ], "tariff": [ { "start": "1/1", "end": "1/1", "Sun": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Mon": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Tue": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Wed": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Thu": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Fri": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Sat": [ { "start": 0, "duration": 1440, "setting": "ZN" } ] } ] }, "override": false, "override_backup_soc": 30, "override_chg_dischg_rate": 0, "override_tou_mode": "StorageTouMode_DEFAULT_TOU_MODE" } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/api_v1_production000066400000000000000000000001601464551303400306320ustar00rootroot00000000000000{ "wattHoursToday": 4374, "wattHoursSevenDays": 111089, "wattHoursLifetime": 3183742, "wattsNow": 689 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/api_v1_production_inverters000066400000000000000000000020421464551303400327340ustar00rootroot00000000000000[ { "serialNumber": "121212121201", "lastReportDate": 1693745036, "devType": 1, "lastReportWatts": 58, "maxReportWatts": 253 }, { "serialNumber": "121212121202", "lastReportDate": 1693745066, "devType": 1, "lastReportWatts": 56, "maxReportWatts": 254 }, { "serialNumber": "121212121203", "lastReportDate": 1693744825, "devType": 1, "lastReportWatts": 135, "maxReportWatts": 365 }, { "serialNumber": "121212121204", "lastReportDate": 1693744828, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 365 }, { "serialNumber": "121212121205", "lastReportDate": 1693744828, "devType": 1, "lastReportWatts": 130, "maxReportWatts": 365 }, { "serialNumber": "121212121206", "lastReportDate": 1693744829, "devType": 1, "lastReportWatts": 127, "maxReportWatts": 365 }, { "serialNumber": "121212121207", "lastReportDate": 1693744946, "devType": 1, "lastReportWatts": 112, "maxReportWatts": 365 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/info000066400000000000000000000041771464551303400261540ustar00rootroot00000000000000 123456789012 800-00654-r08 D7.3.466 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 3eb4d3 590-00019-r01 02.00.01 1f421b 500-00002-r01 07.06.175 f79c8d 500-00005-r01 01.02.371 373aab 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 eaa252 500-00012-r01 02.02.00 40061a 500-00020-r01 21.19.82 667fd7 500-00016-r01 02.00.00 54a6dc 500-00021-r01 01.00.00 19ae14 500-00001-r01 02.00.00 1210 ec2-user-envoy_uber-pkg_master:pkg-Jun-22-23-18:55:22 1687460237 02.00.4238 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/ivp_ensemble_dry_contacts000066400000000000000000000005131464551303400324330ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "open" }, { "id": "NC2", "status": "open" }, { "id": "NO1", "status": "open" }, { "id": "NO2", "status": "open" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/ivp_ensemble_generator000066400000000000000000000002771464551303400317340ustar00rootroot00000000000000{ "admin_state": "unknown", "oper_state": "open", "admin_mode": 0, "schedule": 0, "start_soc": 100, "stop_soc": -1, "exc_on": 0, "present": 1, "type": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/ivp_ensemble_inventory000066400000000000000000000000031464551303400317660ustar00rootroot00000000000000[] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/ivp_ensemble_power000066400000000000000000000000271464551303400310730ustar00rootroot00000000000000{ "devices:": [] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/ivp_ensemble_secctrl000066400000000000000000000013301464551303400313740ustar00rootroot00000000000000{ "shutdown": false, "freq_bias_hz": 0.0, "voltage_bias_v": 0.0, "freq_bias_hz_q8": 0, "voltage_bias_v_q5": 0, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 0, "adjusted_backup_soc": 0, "agg_soc": 0, "Max_energy": 0, "ENC_agg_soc": 0, "ENC_agg_soh": 0, "ENC_agg_backup_energy": 0, "ENC_agg_avail_energy": 0, "Enc_commissioned_capacity": 0, "Enc_max_available_capacity": 0, "ACB_agg_soc": 0, "ACB_agg_energy": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/ivp_ensemble_status000066400000000000000000000045621464551303400312720ustar00rootroot00000000000000{ "inventory": { "serial_nums": {} }, "counters": { "api_ecagtInit": 1, "api_ecagtTick": 6254765, "api_ecagtGetDeviceCount": 6321456, "api_ecagtGetDeviceInfo": 6281617, "api_ecagtSetSecCtrlBias": 564094, "api_ecagtGetSecCtrlBias": 38, "api_ecagtGetSecCtrlBiasQ": 38, "api_ecagtGetRelayState": 7505737, "api_ecagtSetDataModelCache": 1, "api_AggNameplate": 19, "api_ecagtGetGridFreq": 1250953, "api_ecagtGetGridVolt": 1250953, "api_ecagtGetGridFreq_err_notfound": 1250953, "rest_StatusGet": 20, "rest_InventoryGet": 26915, "rest_SubmodGet": 11141, "rest_SecCtrlGet": 19, "rest_CommCheckGet": 26851, "rest_Power": 1, "ext_zb_send_msg": 564094, "txmsg_OBJ_MDL_SECONDARY_CTRL_REQ": 564094, "zmq_ecaHello": 1, "zmq_streamdata": 1250953, "zmq_eca_live_debug_req": 4, "zmq_ecaSecCtrlMsg": 564094, "zmq_meterlog_ok": 1, "dmdl_FILES_INDEXED": 3, "backupSocLimitSet": 564094, "backupSocLimitChanged": 2, "api_ecagtGetGenRelayState": 1250953 }, "secctrl": { "shutdown": false, "freq_bias_hz": 0.0, "voltage_bias_v": 0.0, "freq_bias_hz_q8": 0, "voltage_bias_v_q5": 0, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 0, "adjusted_backup_soc": 0, "agg_soc": 0, "Max_energy": 0, "ENC_agg_soc": 0, "ENC_agg_soh": 0, "ENC_agg_backup_energy": 0, "ENC_agg_avail_energy": 0, "Enc_commissioned_capacity": 0, "Enc_max_available_capacity": 0, "ACB_agg_soc": 0, "ACB_agg_energy": 0 }, "relay": { "mains_admin_state": "closed", "mains_oper_state": "closed", "der1_state": 0, "der2_state": 0, "Enchg_grid_mode": "grid-tied", "Solar_grid_mode": "unknown" }, "profile": { "message": "Obsolete API, please use ivp/arf/profile" }, "fakeit": { "fake_inventory_mode": false } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/ivp_meters000066400000000000000000000007121464551303400273650ustar00rootroot00000000000000[ { "eid": 704643328, "state": "enabled", "measurementType": "production", "phaseMode": "three", "phaseCount": 3, "meteringStatus": "normal", "statusFlags": [] }, { "eid": 704643584, "state": "enabled", "measurementType": "net-consumption", "phaseMode": "three", "phaseCount": 3, "meteringStatus": "normal", "statusFlags": [] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/ivp_meters_readings000066400000000000000000000113541464551303400312450ustar00rootroot00000000000000[ { "eid": 704643328, "timestamp": 1693745133, "actEnergyDlvd": 3183793.885, "actEnergyRcvd": 8851.704, "apparentEnergy": 3576167.385, "reactEnergyLagg": 591594.008, "reactEnergyLead": 0.021, "instantaneousDemand": 488.925, "activePower": 488.925, "apparentPower": 510.003, "reactivePower": 114.596, "pwrFactor": 0.957, "voltage": 235.236, "current": 2.169, "freq": 50.000, "channels": [ { "eid": 1778385169, "timestamp": 1693745133, "actEnergyDlvd": 3183793.885, "actEnergyRcvd": 8851.704, "apparentEnergy": 3576167.385, "reactEnergyLagg": 591594.008, "reactEnergyLead": 0.021, "instantaneousDemand": 488.925, "activePower": 488.925, "apparentPower": 510.003, "reactivePower": 114.596, "pwrFactor": 0.957, "voltage": 235.236, "current": 2.169, "freq": 50.000 }, { "eid": 1778385170, "timestamp": 1693745133, "actEnergyDlvd": 0.000, "actEnergyRcvd": 5370.790, "apparentEnergy": 295.364, "reactEnergyLagg": 387.143, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 6.124, "current": 0.000, "freq": 50.000 }, { "eid": 1778385171, "timestamp": 1693745133, "actEnergyDlvd": 0.022, "actEnergyRcvd": 9818.109, "apparentEnergy": 14032.684, "reactEnergyLagg": 391.775, "reactEnergyLead": 2.189, "instantaneousDemand": -1.044, "activePower": -1.044, "apparentPower": 2.602, "reactivePower": -0.000, "pwrFactor": -1.000, "voltage": 11.469, "current": 0.227, "freq": 50.000 } ] }, { "eid": 704643584, "timestamp": 1693745133, "actEnergyDlvd": 3738205.282, "actEnergyRcvd": 1776768.769, "apparentEnergy": 7252190.779, "reactEnergyLagg": 251.885, "reactEnergyLead": 3174027.145, "instantaneousDemand": -36.162, "activePower": -36.162, "apparentPower": 645.376, "reactivePower": -568.304, "pwrFactor": -0.060, "voltage": 235.201, "current": 2.745, "freq": 50.000, "channels": [ { "eid": 1778385425, "timestamp": 1693745133, "actEnergyDlvd": 3738205.282, "actEnergyRcvd": 1776768.769, "apparentEnergy": 7252190.779, "reactEnergyLagg": 251.885, "reactEnergyLead": 3174027.145, "instantaneousDemand": -36.162, "activePower": -36.162, "apparentPower": 645.376, "reactivePower": -568.304, "pwrFactor": -0.060, "voltage": 235.201, "current": 2.745, "freq": 50.000 }, { "eid": 1778385426, "timestamp": 1693745133, "actEnergyDlvd": 0.000, "actEnergyRcvd": 8279.267, "apparentEnergy": 141.429, "reactEnergyLagg": 378.426, "reactEnergyLead": 0.181, "instantaneousDemand": -0.000, "activePower": -0.000, "apparentPower": -0.000, "reactivePower": 0.000, "pwrFactor": -1.000, "voltage": 2.981, "current": 0.000, "freq": 50.000 }, { "eid": 1778385427, "timestamp": 1693745133, "actEnergyDlvd": 0.013, "actEnergyRcvd": 13980.174, "apparentEnergy": 6016.263, "reactEnergyLagg": 380.215, "reactEnergyLead": 1.245, "instantaneousDemand": -0.451, "activePower": -0.451, "apparentPower": 1.128, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 4.635, "current": 0.242, "freq": 50.000 } ] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/ivp_sc_pvlimit000066400000000000000000000000611464551303400302340ustar00rootroot00000000000000{ "enable": false, "pv_limit_pct": 100 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/ivp_ss_dry_contact_settings000066400000000000000000000027271464551303400330340ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NC2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/ivp_ss_gen_config000066400000000000000000000000031464551303400306620ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/ivp_ss_gen_schedule000066400000000000000000000000031464551303400312110ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/ivp_ss_pel_settings000066400000000000000000000000251464551303400312700ustar00rootroot00000000000000{ "PEL": false } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/production000066400000000000000000000046571464551303400274120ustar00rootroot00000000000000{ "production": [{ "type": "inverters", "activeCount": 7, "readingTime": 0, "wNow": 0, "whLifetime": 4339764 }, { "type": "eim", "activeCount": 1, "measurementType": "production", "readingTime": 1693433002, "wNow": -6.481, "whLifetime": 4351113.2, "varhLeadLifetime": 0.005, "varhLagLifetime": 1264880.372, "vahLifetime": 5559527.987, "rmsCurrent": 0.658, "rmsVoltage": 712.588, "reactPwr": 84.546, "apprntPwr": 156.055, "pwrFactor": 0.0, "whToday": 5113.2, "whLastSevenDays": 69492.2, "vahToday": 8296.987, "varhLeadToday": 0.005, "varhLagToday": 2727.372 } ], "consumption": [{ "type": "eim", "activeCount": 1, "measurementType": "total-consumption", "readingTime": 1693433002, "wNow": 209.084, "whLifetime": 4074795.368, "varhLeadLifetime": 3936400.269, "varhLagLifetime": 1341552.434, "vahLifetime": 8735086.195, "rmsCurrent": 2.708, "rmsVoltage": 712.725, "reactPwr": -464.776, "apprntPwr": 1929.904, "pwrFactor": 0.11, "whToday": 12423.368, "whLastSevenDays": 68784.368, "vahToday": 18948.195, "varhLeadToday": 8224.269, "varhLagToday": 2802.434 }, { "type": "eim", "activeCount": 1, "measurementType": "net-consumption", "readingTime": 1693433002, "wNow": 215.565, "whLifetime": 2886562.459, "varhLeadLifetime": 3936400.264, "varhLagLifetime": 76672.062, "vahLifetime": 8735086.195, "rmsCurrent": 2.05, "rmsVoltage": 712.862, "reactPwr": -380.23, "apprntPwr": 487.922, "pwrFactor": 0.46, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ], "storage": [{ "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.466_with_cts_3phase/production.json000066400000000000000000000206341464551303400303530ustar00rootroot00000000000000{ "production": [{ "type": "inverters", "activeCount": 7, "readingTime": 0, "wNow": 0, "whLifetime": 4339764 }, { "type": "eim", "activeCount": 1, "measurementType": "production", "readingTime": 1693433002, "wNow": -6.481, "whLifetime": 4351113.2, "varhLeadLifetime": 0.005, "varhLagLifetime": 1264880.372, "vahLifetime": 5559527.987, "rmsCurrent": 0.658, "rmsVoltage": 712.588, "reactPwr": 84.546, "apprntPwr": 156.055, "pwrFactor": 0.0, "whToday": 5113.2, "whLastSevenDays": 69492.2, "vahToday": 8296.987, "varhLeadToday": 0.005, "varhLagToday": 2727.372, "lines": [{ "wNow": -2.864, "whLifetime": 1869678.394, "varhLeadLifetime": 0.002, "varhLagLifetime": 539695.061, "vahLifetime": 2377390.886, "rmsCurrent": 0.286, "rmsVoltage": 236.766, "reactPwr": 50.856, "apprntPwr": 67.699, "pwrFactor": 0.0, "whToday": 2200.394, "whLastSevenDays": 29891.394, "vahToday": 3576.886, "varhLeadToday": 0.002, "varhLagToday": 1163.061 }, { "wNow": 0.0, "whLifetime": 1241245.645, "varhLeadLifetime": 0.001, "varhLagLifetime": 366839.383, "vahLifetime": 1241038.844, "rmsCurrent": -0.0, "rmsVoltage": 237.918, "reactPwr": 0.0, "apprntPwr": -0.0, "pwrFactor": 0.0, "whToday": 1454.645, "whLastSevenDays": 19793.645, "vahToday": 1528.844, "varhLeadToday": 0.001, "varhLagToday": 792.383 }, { "wNow": -3.617, "whLifetime": 1240189.161, "varhLeadLifetime": 0.002, "varhLagLifetime": 358345.928, "vahLifetime": 1941098.256, "rmsCurrent": 0.372, "rmsVoltage": 237.904, "reactPwr": 33.69, "apprntPwr": 88.355, "pwrFactor": 0.0, "whToday": 1458.161, "whLastSevenDays": 19807.161, "vahToday": 3191.256, "varhLeadToday": 0.002, "varhLagToday": 771.928 } ] } ], "consumption": [{ "type": "eim", "activeCount": 1, "measurementType": "total-consumption", "readingTime": 1693433002, "wNow": 209.084, "whLifetime": 4074795.368, "varhLeadLifetime": 3936400.269, "varhLagLifetime": 1341552.434, "vahLifetime": 8735086.195, "rmsCurrent": 2.708, "rmsVoltage": 712.725, "reactPwr": -464.776, "apprntPwr": 1929.904, "pwrFactor": 0.11, "whToday": 12423.368, "whLastSevenDays": 68784.368, "vahToday": 18948.195, "varhLeadToday": 8224.269, "varhLagToday": 2802.434, "lines": [{ "wNow": 88.573, "whLifetime": 2293782.928, "varhLeadLifetime": 2114284.979, "varhLagLifetime": 578414.935, "vahLifetime": 4268391.905, "rmsCurrent": 1.295, "rmsVoltage": 236.836, "reactPwr": -257.565, "apprntPwr": 306.73, "pwrFactor": 0.29, "whToday": 8584.928, "whLastSevenDays": 39391.928, "vahToday": 10866.905, "varhLeadToday": 4108.979, "varhLagToday": 1188.935 }, { "wNow": 123.364, "whLifetime": 948057.969, "varhLeadLifetime": 1059082.625, "varhLagLifetime": 383807.966, "vahLifetime": 2331874.944, "rmsCurrent": 0.861, "rmsVoltage": 237.934, "reactPwr": -132.184, "apprntPwr": 204.919, "pwrFactor": 0.6, "whToday": 2154.969, "whLastSevenDays": 18948.969, "vahToday": 4293.944, "varhLeadToday": 2783.625, "varhLagToday": 815.966 }, { "wNow": -2.853, "whLifetime": 832954.471, "varhLeadLifetime": 763032.665, "varhLagLifetime": 379329.532, "vahLifetime": 2134819.346, "rmsCurrent": 0.551, "rmsVoltage": 237.956, "reactPwr": -75.026, "apprntPwr": 131.213, "pwrFactor": -0.02, "whToday": 1683.471, "whLastSevenDays": 10443.471, "vahToday": 3787.346, "varhLeadToday": 1331.665, "varhLagToday": 797.532 } ] }, { "type": "eim", "activeCount": 1, "measurementType": "net-consumption", "readingTime": 1693433002, "wNow": 215.565, "whLifetime": 2886562.459, "varhLeadLifetime": 3936400.264, "varhLagLifetime": 76672.062, "vahLifetime": 8735086.195, "rmsCurrent": 2.05, "rmsVoltage": 712.862, "reactPwr": -380.23, "apprntPwr": 487.922, "pwrFactor": 0.46, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0, "lines": [{ "wNow": 91.437, "whLifetime": 1625201.414, "varhLeadLifetime": 2114284.977, "varhLagLifetime": 38719.874, "vahLifetime": 4268391.905, "rmsCurrent": 1.009, "rmsVoltage": 236.905, "reactPwr": -206.71, "apprntPwr": 238.691, "pwrFactor": 0.41, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 }, { "wNow": 123.364, "whLifetime": 629892.171, "varhLeadLifetime": 1059082.624, "varhLagLifetime": 16968.583, "vahLifetime": 2331874.944, "rmsCurrent": 0.861, "rmsVoltage": 237.949, "reactPwr": -132.184, "apprntPwr": 206.35, "pwrFactor": 0.61, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 }, { "wNow": 0.764, "whLifetime": 631468.875, "varhLeadLifetime": 763032.663, "varhLagLifetime": 20983.605, "vahLifetime": 2134819.346, "rmsCurrent": 0.179, "rmsVoltage": 238.007, "reactPwr": -41.336, "apprntPwr": 42.881, "pwrFactor": 0.0, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ] } ], "storage": [{ "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/000077500000000000000000000000001464551303400221135ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/admin_lib_tariff000066400000000000000000000112001464551303400253010ustar00rootroot00000000000000{ "tariff": { "currency": { "code": "USD" }, "logger": "mylogger", "date": "1692471808", "storage_settings": { "mode": "backup", "operation_mode_sub_type": "", "reserved_soc": 100.0, "very_low_soc": 10, "charge_from_grid": true, "date": "1692471808" }, "single_rate": { "rate": 0.0, "sell": 0.0 }, "seasons": [], "seasons_sell": [] }, "schedule": { "source": "Tariff", "date": "2023-08-19 19:04:23 UTC", "version": "00.00.02", "reserved_soc": 100.0, "operation_mode_sub_type": "", "very_low_soc": 10, "charge_from_grid": true, "battery_mode": "backup", "schedule": { "Disable": [ { "Sun": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Mon": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Tue": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Wed": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Thu": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Fri": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Sat": [ { "start": 0, "duration": 1440, "setting": "ID" } ] } ], "tariff": [ { "start": "1/1", "end": "1/1", "Sun": [ { "start": 0, "duration": 1440, "setting": "CG" } ], "Mon": [ { "start": 0, "duration": 1440, "setting": "CG" } ], "Tue": [ { "start": 0, "duration": 1440, "setting": "CG" } ], "Wed": [ { "start": 0, "duration": 1440, "setting": "CG" } ], "Thu": [ { "start": 0, "duration": 1440, "setting": "CG" } ], "Fri": [ { "start": 0, "duration": 1440, "setting": "CG" } ], "Sat": [ { "start": 0, "duration": 1440, "setting": "CG" } ] } ] }, "override": false, "override_backup_soc": 30.0, "override_chg_dischg_rate": 0.0, "override_tou_mode": "StorageTouMode_DEFAULT_TOU_MODE" } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/admin_lib_tariff_log.json000066400000000000000000000006131464551303400271200ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:37 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/api_v1_production000066400000000000000000000001631464551303400254630ustar00rootroot00000000000000{ "wattHoursToday": 17645, "wattHoursSevenDays": 217726, "wattHoursLifetime": 19229325, "wattsNow": 5326 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/api_v1_production_inverters000066400000000000000000000063751464551303400275770ustar00rootroot00000000000000[ { "serialNumber": "202043003473", "lastReportDate": 1692817928, "devType": 1, "lastReportWatts": 209, "maxReportWatts": 243 }, { "serialNumber": "202043003484", "lastReportDate": 1692817869, "devType": 1, "lastReportWatts": 213, "maxReportWatts": 244 }, { "serialNumber": "202043002877", "lastReportDate": 1692817778, "devType": 1, "lastReportWatts": 197, "maxReportWatts": 244 }, { "serialNumber": "202043003803", "lastReportDate": 1692817808, "devType": 1, "lastReportWatts": 210, "maxReportWatts": 244 }, { "serialNumber": "202043001781", "lastReportDate": 1692817838, "devType": 1, "lastReportWatts": 218, "maxReportWatts": 245 }, { "serialNumber": "202043003467", "lastReportDate": 1692817748, "devType": 1, "lastReportWatts": 186, "maxReportWatts": 245 }, { "serialNumber": "202043001326", "lastReportDate": 1692817929, "devType": 1, "lastReportWatts": 205, "maxReportWatts": 244 }, { "serialNumber": "202042085758", "lastReportDate": 1692817781, "devType": 1, "lastReportWatts": 198, "maxReportWatts": 243 }, { "serialNumber": "202106021181", "lastReportDate": 1692817958, "devType": 1, "lastReportWatts": 204, "maxReportWatts": 243 }, { "serialNumber": "202043002733", "lastReportDate": 1692817871, "devType": 1, "lastReportWatts": 212, "maxReportWatts": 244 }, { "serialNumber": "202043002762", "lastReportDate": 1692817752, "devType": 1, "lastReportWatts": 186, "maxReportWatts": 244 }, { "serialNumber": "202106049949", "lastReportDate": 1692817841, "devType": 1, "lastReportWatts": 220, "maxReportWatts": 244 }, { "serialNumber": "202043002943", "lastReportDate": 1692817753, "devType": 1, "lastReportWatts": 187, "maxReportWatts": 242 }, { "serialNumber": "202043001340", "lastReportDate": 1692817840, "devType": 1, "lastReportWatts": 220, "maxReportWatts": 245 }, { "serialNumber": "202043002628", "lastReportDate": 1692817754, "devType": 1, "lastReportWatts": 188, "maxReportWatts": 245 }, { "serialNumber": "202106046737", "lastReportDate": 1692817754, "devType": 1, "lastReportWatts": 187, "maxReportWatts": 244 }, { "serialNumber": "202043003256", "lastReportDate": 1692817841, "devType": 1, "lastReportWatts": 218, "maxReportWatts": 245 }, { "serialNumber": "202106046579", "lastReportDate": 1692817965, "devType": 1, "lastReportWatts": 201, "maxReportWatts": 244 }, { "serialNumber": "202042084581", "lastReportDate": 1692817988, "devType": 1, "lastReportWatts": 199, "maxReportWatts": 245 }, { "serialNumber": "202043003454", "lastReportDate": 1692817816, "devType": 1, "lastReportWatts": 211, "maxReportWatts": 243 }, { "serialNumber": "202043003123", "lastReportDate": 1692817816, "devType": 1, "lastReportWatts": 209, "maxReportWatts": 245 }, { "serialNumber": "202043002631", "lastReportDate": 1692817819, "devType": 1, "lastReportWatts": 212, "maxReportWatts": 243 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/api_v1_production_inverters_log.json000066400000000000000000000005021464551303400313720ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:34 GMT", "content-type": "application/json", "content-length": "3325", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/api_v1_production_log.json000066400000000000000000000005011464551303400272700ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:34 GMT", "content-type": "application/json", "content-length": "115", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/info000066400000000000000000000041771464551303400230020ustar00rootroot00000000000000 122027033238 800-00555-r03 D7.3.517 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 b62bb8 590-00018-r01 02.00.01 426697 500-00002-r01 07.03.517 a5b17f 500-00004-r01 01.02.419 afbd20 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 480872 500-00012-r01 02.02.00 020101 500-00016-r01 02.00.00 54a6dc 500-00020-r01 22.13.09 ab8b4a 500-00021-r01 01.00.00 19ae14 500-00001-r01 02.00.00 1210 ec2-user-envoy_uber-pkg_master:pkg-Mar-28-23-21:17:00 1680038329 02.00.3983 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/info_log.json000066400000000000000000000005751464551303400246110ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:34 GMT", "content-type": "text/xml", "content-length": "2175", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ensemble_dry_contacts000066400000000000000000000005231464551303400272620ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "closed" }, { "id": "NC2", "status": "closed" }, { "id": "NO1", "status": "closed" }, { "id": "NO2", "status": "closed" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ensemble_dry_contacts_log.json000066400000000000000000000004351464551303400310750ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:35 GMT", "content-length": "338", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ensemble_generator000066400000000000000000000002771464551303400265620ustar00rootroot00000000000000{ "admin_state": "unknown", "oper_state": "open", "admin_mode": 0, "schedule": 0, "start_soc": 100, "stop_soc": -1, "exc_on": 0, "present": 1, "type": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ensemble_generator_log.json000066400000000000000000000004351464551303400303670ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:21:56 GMT", "content-length": "190", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ensemble_inventory000066400000000000000000000107751464551303400266350ustar00rootroot00000000000000[ { "type": "ENCHARGE", "devices": [ { "part_num": "830-00703-r67", "installed": 1692651649, "serial_num": "122035013273", "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1692817971, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1692651649, "img_load_date": 1692651649, "img_pnum_running": "2.0.5663_rel/22.13", "zigbee_dongle_fw_version": "100B", "bmu_fw_version": "2.1.27", "operating": true, "communicating": true, "sleep_enabled": false, "percentFull": 100, "temperature": 28, "maxCellTemp": 28, "comm_level_sub_ghz": 5, "comm_level_2_4_ghz": 5, "led_status": 14, "dc_switch_off": false, "encharge_rev": 1, "encharge_capacity": 3360 }, { "part_num": "830-00703-r67", "installed": 1692651650, "serial_num": "122035013278", "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1692817716, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1692651650, "img_load_date": 1692651650, "img_pnum_running": "2.0.5663_rel/22.13", "zigbee_dongle_fw_version": "100B", "bmu_fw_version": "2.1.27", "operating": true, "communicating": true, "sleep_enabled": false, "percentFull": 100, "temperature": 28, "maxCellTemp": 29, "comm_level_sub_ghz": 5, "comm_level_2_4_ghz": 5, "led_status": 14, "dc_switch_off": false, "encharge_rev": 1, "encharge_capacity": 3360 }, { "part_num": "830-00703-r67", "installed": 1692779890, "serial_num": "122035013286", "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1692817944, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1692779890, "img_load_date": 1692779890, "img_pnum_running": "2.0.5663_rel/22.13", "zigbee_dongle_fw_version": "100B", "bmu_fw_version": "2.1.27", "operating": true, "communicating": true, "sleep_enabled": false, "percentFull": 100, "temperature": 28, "maxCellTemp": 29, "comm_level_sub_ghz": 5, "comm_level_2_4_ghz": 5, "led_status": 14, "dc_switch_off": false, "encharge_rev": 1, "encharge_capacity": 3360 } ] }, { "type": "ENPOWER", "devices": [ { "part_num": "860-00276-r28", "installed": 1692651723, "serial_num": "122029016399", "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1692817873, "admin_state": 24, "admin_state_str": "ENPWR_STATE_OPER_CLOSED", "created_date": 1692651723, "img_load_date": 1692651723, "img_pnum_running": "1.5.5229_rel/22.13", "zigbee_dongle_fw_version": "100B", "operating": true, "communicating": true, "temperature": 88, "comm_level_sub_ghz": 5, "comm_level_2_4_ghz": 5, "mains_admin_state": "closed", "mains_oper_state": "closed", "Enpwr_grid_mode": "multimode-ongrid", "Enchg_grid_mode": "multimode-ongrid", "Enpwr_relay_state_bm": 15664, "Enpwr_curr_state_id": 16 } ] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ensemble_inventory_log.json000066400000000000000000000004361464551303400304370ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:35 GMT", "content-length": "4604", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ensemble_power000066400000000000000000000007541464551303400257300ustar00rootroot00000000000000{ "devices:": [ { "serial_num": "122035013273", "real_power_mw": 0, "apparent_power_mva": 0, "soc": 100 }, { "serial_num": "122035013278", "real_power_mw": 0, "apparent_power_mva": 0, "soc": 100 }, { "serial_num": "122035013286", "real_power_mw": 0, "apparent_power_mva": 0, "soc": 100 } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ensemble_power_log.json000066400000000000000000000004351464551303400275350ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:35 GMT", "content-length": "491", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ensemble_secctrl000066400000000000000000000013671464551303400262340ustar00rootroot00000000000000{ "shutdown": false, "freq_bias_hz": -1.3200000524520875, "voltage_bias_v": -16.0, "freq_bias_hz_q8": -2123, "voltage_bias_v_q5": -512, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 100, "adjusted_backup_soc": 100, "agg_soc": 100, "Max_energy": 10080, "ENC_agg_soc": 100, "ENC_agg_backup_energy": 10080, "ENC_agg_avail_energy": 10080, "Enc_commissioned_capacity": 10080, "Enc_max_available_capacity": 10080, "ACB_agg_soc": 0, "ACB_agg_energy": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ensemble_secctrl_log.json000066400000000000000000000004351464551303400300400ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:36 GMT", "content-length": "758", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ensemble_status000066400000000000000000000463421464551303400261220ustar00rootroot00000000000000{ "inventory": { "serial_nums": { "122029016399": { "device_type": 17, "admin_state": 24, "admin_state_str": "ENPWR_STATE_OPER_CLOSED", "msg_retry_count": 2, "part_number": "860-00276-r28", "assembly_number": "880-00981-r28", "app_fw_version": "1.5.5229_rel/22.13", "zb_fw_version": "100B", "zb_bootloader_vers": "1.8.1", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "", "bmu_fw_version": "", "submodule_count": 1, "submodules": { "122028018664": { "device_type": 18, "admin_state": 1, "part_number": "800-01306-r06", "assembly_number": "880-01306-r06", "dmir": { "part_number": "546-00003-01", "assembly_number": "01" }, "procload": { "part_number": "522-00003-01", "assembly_number": "1.5.5229_rel/22.13" } } } }, "122035013273": { "device_type": 13, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "multimode-ongrid", "phase": 1, "encharge_revision": 1, "encharge_capacity": 3360, "encharge_rated_power": 1280, "reported_enc_grid_state": "grid-tied", "msg_retry_count": 0, "part_number": "830-00703-r67", "assembly_number": "890-00020-r42", "app_fw_version": "2.0.5663_rel/22.13", "zb_fw_version": "100B", "zb_bootloader_vers": "1.8.1", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "2.1.27", "submodule_count": 6, "submodules": { "122033028286": { "device_type": 15, "admin_state": 1, "part_number": "800-01304-r06", "assembly_number": "880-01304-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "2.0.5663_rel/22.13" } }, "122033028845": { "device_type": 16, "admin_state": 1, "part_number": "620-00283-r06", "assembly_number": "800-00283-r06", "dmir": { "part_number": "", "assembly_number": "" }, "procload": { "part_number": "490-00154", "assembly_number": "2.1.27" } }, "122034045036": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034045262": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034054826": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034054904": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } } } }, "122035013278": { "device_type": 13, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "multimode-ongrid", "phase": 1, "encharge_revision": 1, "encharge_capacity": 3360, "encharge_rated_power": 1280, "reported_enc_grid_state": "grid-tied", "msg_retry_count": 0, "part_number": "830-00703-r67", "assembly_number": "890-00020-r42", "app_fw_version": "2.0.5663_rel/22.13", "zb_fw_version": "100B", "zb_bootloader_vers": "1.8.1", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "2.1.27", "submodule_count": 6, "submodules": { "122033028671": { "device_type": 15, "admin_state": 1, "part_number": "800-01304-r06", "assembly_number": "880-01304-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "2.0.5663_rel/22.13" } }, "122033028972": { "device_type": 16, "admin_state": 1, "part_number": "620-00283-r06", "assembly_number": "800-00283-r06", "dmir": { "part_number": "", "assembly_number": "" }, "procload": { "part_number": "490-00154", "assembly_number": "2.1.27" } }, "122034044640": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034045408": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034055224": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034055397": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } } } }, "122035013286": { "device_type": 13, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "multimode-ongrid", "phase": 1, "encharge_revision": 1, "encharge_capacity": 3360, "encharge_rated_power": 1280, "reported_enc_grid_state": "grid-tied", "msg_retry_count": 0, "part_number": "830-00703-r67", "assembly_number": "890-00020-r42", "app_fw_version": "2.0.5663_rel/22.13", "zb_fw_version": "100B", "zb_bootloader_vers": "1.8.1", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "2.1.27", "submodule_count": 6, "submodules": { "122033028343": { "device_type": 15, "admin_state": 1, "part_number": "800-01304-r06", "assembly_number": "880-01304-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "2.0.5663_rel/22.13" } }, "122033028869": { "device_type": 16, "admin_state": 1, "part_number": "620-00283-r06", "assembly_number": "800-00283-r06", "dmir": { "part_number": "", "assembly_number": "" }, "procload": { "part_number": "490-00154", "assembly_number": "2.1.27" } }, "122034044651": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034045492": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034055464": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034055475": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } } } } } }, "counters": { "api_ecagtInit": 1, "api_ecagtTick": 598589, "api_ecagtDeviceInsert": 6, "api_ecagtDeviceNetworkStatus": 33251, "api_ecagtGetDeviceCount": 609035, "api_ecagtGetDeviceInfo": 608323, "api_ecagtGetOneDeviceInfo": 1710, "api_ecagtDevIdToSerial": 52526, "api_ecagtHandleMsg": 51808, "api_ecagtGetSubmoduleInv": 16524, "api_ecagtGetDataModelRaw": 47195, "api_ecagtSetSecCtrlBias": 55128, "api_ecagtGetSecCtrlBias": 978, "api_ecagtGetSecCtrlBiasQ": 978, "api_ecagtGetRelayState": 1203323, "api_ecagtSetDataModelCache": 1, "api_AggNameplate": 428, "api_ecagtGetGridFreq": 598589, "api_ecagtGetGridVolt": 598589, "api_ecagtGetGridFreq_err_oor": 312, "rest_StatusGet": 429, "rest_InventoryGet": 3019, "rest_SubmodGet": 3524, "rest_SecCtrlGet": 550, "rest_RelayGet": 2520, "rest_CommCheckGet": 2520, "rest_Power": 1772, "ext_zb_send_msg": 76593, "ext_cfg_save_device": 6, "ext_cfg_save_device_err": 6, "ext_send_perf_data": 33804, "ext_event_set_stateful": 210, "ext_event_set_modgone": 16, "rxmsg_OBJ_MDL_META_RSP": 5, "rxmsg_OBJ_MDL_INV_UPD_RSP": 440, "rxmsg_OBJ_MDL_POLL_RSP": 45551, "rxmsg_OBJ_MDL_RELAY_CTRL_RSP": 3, "rxmsg_OBJ_MDL_RELAY_STATUS_REQ": 5513, "rxmsg_OBJ_MDL_GRID_STATUS_RSP": 7, "rxmsg_OBJ_MDL_EVENTS_MSG": 147, "rxmsg_OBJ_MDL_SOC_CONFIG_RSP": 7, "rxmsg_OBJ_MDL_ERROR_DRY_CTRL_RSP": 16, "rxmsg_OBJ_MDL_ERROR_DRY_STATUS_RSP": 96, "txmsg_OBJ_MDL_META_REQ": 5, "txmsg_OBJ_MDL_ENP_RT_POLL_REQ": 12718, "txmsg_OBJ_MDL_BMU_POLL_REQ": 1493, "txmsg_OBJ_MDL_PCU_POLL_REQ": 1495, "txmsg_OBJ_MDL_SECONDARY_CTRL_REQ": 55098, "txmsg_OBJ_MDL_RELAY_CTRL_REQ": 3, "txmsg_OBJ_MDL_GRID_STATUS_REQ": 7, "txmsg_OBJ_MDL_RELAY_STATUS_RSP": 5500, "txmsg_OBJ_MDL_EVENTS_ACK": 147, "txmsg_OBJ_MDL_SOC_CONFIG_REQ": 7, "txmsg_OBJ_MDL_TNS_START": 8, "rxmsg_OBJ_MDL_TNS_START_RSP": 9, "txmsg_OBJ_MDL_SET_UDMIR": 8, "rxmsg_OBJ_MDL_SET_UDMIR_RSP": 6, "txmsg_OBJ_MDL_TNS_END": 8, "rxmsg_OBJ_MDL_TNS_END_RSP": 8, "zmq_ecaHello": 1, "zmq_ecaDevInfo": 9, "zmq_ecaNetworkStatus": 33251, "zmq_ecaAppMsg": 51814, "zmq_streamdata": 598589, "zmq_nameplate": 5, "zmq_ecaSecCtrlMsg": 55128, "zmq_meterlog_ok": 1, "dmdl_FILES_INDEXED": 3, "devPollMissing": 5243, "gridProfileTransaction": 16, "secctrlNotReady": 30, "profile_txn_ack": 8, "dry_contact_txn_retry_failure": 4, "dry_contact_txn_ack": 16, "backupSocLimitSet": 56208, "backupSocLimitChanged": 2, "api_ecagtGetGenRelayState": 598589 }, "secctrl": { "shutdown": false, "freq_bias_hz": -1.3200000524520875, "voltage_bias_v": -16.0, "freq_bias_hz_q8": -2123, "voltage_bias_v_q5": -512, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 100, "adjusted_backup_soc": 100, "agg_soc": 100, "Max_energy": 10080, "ENC_agg_soc": 100, "ENC_agg_backup_energy": 10080, "ENC_agg_avail_energy": 10080, "Enc_commissioned_capacity": 10080, "Enc_max_available_capacity": 10080, "ACB_agg_soc": 0, "ACB_agg_energy": 0 }, "relay": { "mains_admin_state": "closed", "mains_oper_state": "closed", "der1_state": 1, "der2_state": 0, "Enchg_grid_mode": "multimode-ongrid", "Solar_grid_mode": "multimode-ongrid" }, "profile": { "message": "Obsolete API, please use ivp/arf/profile" }, "fakeit": { "fake_inventory_mode": false } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ensemble_status_log.json000066400000000000000000000004371464551303400277260ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:35 GMT", "content-length": "19681", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_sc_pvlimit000066400000000000000000000000611464551303400250620ustar00rootroot00000000000000{ "enable": false, "pv_limit_pct": 100 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_sc_pvlimit_log.json000066400000000000000000000004341464551303400266770ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:37 GMT", "content-length": "48", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ss_dry_contact_settings000066400000000000000000000043421464551303400276550ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "type": "LOAD", "grid_action": "apply", "micro_grid_action": "shed", "gen_action": "shed", "essential_start_time": 32400.0, "essential_end_time": 57600.0, "priority": 1.0, "black_s_start": 5.0, "override": "true", "manual_override": "true", "load_name": "NC1 Test", "mode": "manual", "soc_low": 25.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NC2", "type": "LOAD", "grid_action": "apply", "micro_grid_action": "shed", "gen_action": "shed", "essential_start_time": 32400.0, "essential_end_time": 57600.0, "priority": 2.0, "black_s_start": 5.0, "override": "true", "manual_override": "true", "load_name": "NC2", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO1", "type": "LOAD", "grid_action": "shed", "micro_grid_action": "apply", "gen_action": "apply", "essential_start_time": 32400.0, "essential_end_time": 57600.0, "priority": 3.0, "black_s_start": 5.0, "override": "true", "manual_override": "true", "load_name": "No1", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO2", "type": "LOAD", "grid_action": "shed", "micro_grid_action": "apply", "gen_action": "apply", "essential_start_time": 32400.0, "essential_end_time": 57600.0, "priority": 4.0, "black_s_start": 5.0, "override": "true", "manual_override": "true", "load_name": "NO2", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ss_dry_contact_settings_log.json000066400000000000000000000004361464551303400314660ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:36 GMT", "content-length": "2273", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ss_gen_config000066400000000000000000000000031464551303400255100ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ss_gen_config_log.json000066400000000000000000000004331464551303400273300ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:37 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ss_gen_schedule000066400000000000000000000000031464551303400260370ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ss_gen_schedule_log.json000066400000000000000000000004331464551303400276570ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:37 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ss_pel_settings000066400000000000000000000004621464551303400261230ustar00rootroot00000000000000{ "PEL": false, "Hard_PEL": false, "Soft_PEL": false, "Export_Limit_Type": "Aggregate", "percent": false, "apparent": false, "PEL_Limit": 0.0, "Comm_Time_Loss": 0.0, "Resp_Time_SoftPEL": 0.0, "Resp_Time_HardPEL": 0.0, "msReset_HardPEL": 0.0, "PEL_db": 0.0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/ivp_ss_pel_settings_log.json000066400000000000000000000004351464551303400277340ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:37 GMT", "content-length": "305", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/production000066400000000000000000000047721464551303400242360ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 22, "readingTime": 1692817988, "wNow": 4490, "whLifetime": 183353 }, { "type": "eim", "activeCount": 1, "measurementType": "production", "readingTime": 1692818015, "wNow": 4300.164, "whLifetime": 19230314.735, "varhLeadLifetime": 0.446, "varhLagLifetime": 9375571.84, "vahLifetime": 25459516.463, "rmsCurrent": 34.896, "rmsVoltage": 243.325, "reactPwr": 404.183, "apprntPwr": 4377.722, "pwrFactor": 0.99, "whToday": 18634.735, "whLastSevenDays": 218715.735, "vahToday": 22750.463, "varhLeadToday": 0.446, "varhLagToday": 6529.84 } ], "consumption": [ { "type": "eim", "activeCount": 1, "measurementType": "total-consumption", "readingTime": 1692818015, "wNow": 3802.98, "whLifetime": 27629800.274, "varhLeadLifetime": 13182910.902, "varhLagLifetime": -9185383.822, "vahLifetime": 35703441.771, "rmsCurrent": 24.973, "rmsVoltage": 243.174, "reactPwr": 119.982, "apprntPwr": 3036.232, "pwrFactor": 1.0, "whToday": 24293.274, "whLastSevenDays": 853.274, "vahToday": 20422.771, "varhLeadToday": 8438.902, "varhLagToday": 0.0 }, { "type": "eim", "activeCount": 1, "measurementType": "net-consumption", "readingTime": 1692818015, "wNow": -497.185, "whLifetime": 8436418.786, "varhLeadLifetime": 13182911.347, "varhLagLifetime": 190188.018, "vahLifetime": 35703441.771, "rmsCurrent": -9.923, "rmsVoltage": 243.174, "reactPwr": -284.201, "apprntPwr": -1206.704, "pwrFactor": -1.0, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/production.json000066400000000000000000000047751464551303400252110ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 22, "readingTime": 1692817988, "wNow": 4490, "whLifetime": 183353 }, { "type": "eim", "activeCount": 1, "measurementType": "production", "readingTime": 1692818014, "wNow": 4556.139, "whLifetime": 19230313.461, "varhLeadLifetime": 0.446, "varhLagLifetime": 9375571.716, "vahLifetime": 25459515.173, "rmsCurrent": 36.856, "rmsVoltage": 243.341, "reactPwr": 407.762, "apprntPwr": 4646.052, "pwrFactor": 0.98, "whToday": 18633.461, "whLastSevenDays": 218714.461, "vahToday": 22749.173, "varhLeadToday": 0.446, "varhLagToday": 6529.716 } ], "consumption": [ { "type": "eim", "activeCount": 1, "measurementType": "total-consumption", "readingTime": 1692818014, "wNow": 3791.075, "whLifetime": 27629799.104, "varhLeadLifetime": 13182910.813, "varhLagLifetime": -9185383.698, "vahLifetime": 35703441.404, "rmsCurrent": 25.982, "rmsVoltage": 243.198, "reactPwr": 120.73, "apprntPwr": 3159.183, "pwrFactor": 1.0, "whToday": 24292.104, "whLastSevenDays": 852.104, "vahToday": 20422.404, "varhLeadToday": 8438.813, "varhLagToday": 0.0 }, { "type": "eim", "activeCount": 1, "measurementType": "net-consumption", "readingTime": 1692818014, "wNow": -765.064, "whLifetime": 8436418.891, "varhLeadLifetime": 13182911.259, "varhLagLifetime": 190188.018, "vahLifetime": 35703441.404, "rmsCurrent": -10.874, "rmsVoltage": 243.198, "reactPwr": -287.032, "apprntPwr": -1322.483, "pwrFactor": -1.0, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/production.json_log.json000066400000000000000000000006131464551303400270050ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:35 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517/production_log.json000066400000000000000000000006131464551303400260350ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:35 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/000077500000000000000000000000001464551303400261755ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/admin_lib_tariff000066400000000000000000000112061464551303400313710ustar00rootroot00000000000000{ "tariff": { "currency": { "code": "USD" }, "logger": "mylogger", "date": "1692471808", "storage_settings": { "mode": "savings-mode", "operation_mode_sub_type": "", "reserved_soc": 100.0, "very_low_soc": 10, "charge_from_grid": true, "date": "1692471808" }, "single_rate": { "rate": 0.0, "sell": 0.0 }, "seasons": [], "seasons_sell": [] }, "schedule": { "source": "Tariff", "date": "2023-08-19 19:04:23 UTC", "version": "00.00.02", "reserved_soc": 100.0, "operation_mode_sub_type": "", "very_low_soc": 10, "charge_from_grid": true, "battery_mode": "backup", "schedule": { "Disable": [ { "Sun": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Mon": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Tue": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Wed": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Thu": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Fri": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Sat": [ { "start": 0, "duration": 1440, "setting": "ID" } ] } ], "tariff": [ { "start": "1/1", "end": "1/1", "Sun": [ { "start": 0, "duration": 1440, "setting": "CG" } ], "Mon": [ { "start": 0, "duration": 1440, "setting": "CG" } ], "Tue": [ { "start": 0, "duration": 1440, "setting": "CG" } ], "Wed": [ { "start": 0, "duration": 1440, "setting": "CG" } ], "Thu": [ { "start": 0, "duration": 1440, "setting": "CG" } ], "Fri": [ { "start": 0, "duration": 1440, "setting": "CG" } ], "Sat": [ { "start": 0, "duration": 1440, "setting": "CG" } ] } ] }, "override": false, "override_backup_soc": 30.0, "override_chg_dischg_rate": 0.0, "override_tou_mode": "StorageTouMode_DEFAULT_TOU_MODE" } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/admin_lib_tariff_log.json000066400000000000000000000006131464551303400332020ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:37 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/api_v1_production000066400000000000000000000001631464551303400315450ustar00rootroot00000000000000{ "wattHoursToday": 17645, "wattHoursSevenDays": 217726, "wattHoursLifetime": 19229325, "wattsNow": 5326 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/api_v1_production_inverters000066400000000000000000000063751464551303400336610ustar00rootroot00000000000000[ { "serialNumber": "202043003473", "lastReportDate": 1692817928, "devType": 1, "lastReportWatts": 209, "maxReportWatts": 243 }, { "serialNumber": "202043003484", "lastReportDate": 1692817869, "devType": 1, "lastReportWatts": 213, "maxReportWatts": 244 }, { "serialNumber": "202043002877", "lastReportDate": 1692817778, "devType": 1, "lastReportWatts": 197, "maxReportWatts": 244 }, { "serialNumber": "202043003803", "lastReportDate": 1692817808, "devType": 1, "lastReportWatts": 210, "maxReportWatts": 244 }, { "serialNumber": "202043001781", "lastReportDate": 1692817838, "devType": 1, "lastReportWatts": 218, "maxReportWatts": 245 }, { "serialNumber": "202043003467", "lastReportDate": 1692817748, "devType": 1, "lastReportWatts": 186, "maxReportWatts": 245 }, { "serialNumber": "202043001326", "lastReportDate": 1692817929, "devType": 1, "lastReportWatts": 205, "maxReportWatts": 244 }, { "serialNumber": "202042085758", "lastReportDate": 1692817781, "devType": 1, "lastReportWatts": 198, "maxReportWatts": 243 }, { "serialNumber": "202106021181", "lastReportDate": 1692817958, "devType": 1, "lastReportWatts": 204, "maxReportWatts": 243 }, { "serialNumber": "202043002733", "lastReportDate": 1692817871, "devType": 1, "lastReportWatts": 212, "maxReportWatts": 244 }, { "serialNumber": "202043002762", "lastReportDate": 1692817752, "devType": 1, "lastReportWatts": 186, "maxReportWatts": 244 }, { "serialNumber": "202106049949", "lastReportDate": 1692817841, "devType": 1, "lastReportWatts": 220, "maxReportWatts": 244 }, { "serialNumber": "202043002943", "lastReportDate": 1692817753, "devType": 1, "lastReportWatts": 187, "maxReportWatts": 242 }, { "serialNumber": "202043001340", "lastReportDate": 1692817840, "devType": 1, "lastReportWatts": 220, "maxReportWatts": 245 }, { "serialNumber": "202043002628", "lastReportDate": 1692817754, "devType": 1, "lastReportWatts": 188, "maxReportWatts": 245 }, { "serialNumber": "202106046737", "lastReportDate": 1692817754, "devType": 1, "lastReportWatts": 187, "maxReportWatts": 244 }, { "serialNumber": "202043003256", "lastReportDate": 1692817841, "devType": 1, "lastReportWatts": 218, "maxReportWatts": 245 }, { "serialNumber": "202106046579", "lastReportDate": 1692817965, "devType": 1, "lastReportWatts": 201, "maxReportWatts": 244 }, { "serialNumber": "202042084581", "lastReportDate": 1692817988, "devType": 1, "lastReportWatts": 199, "maxReportWatts": 245 }, { "serialNumber": "202043003454", "lastReportDate": 1692817816, "devType": 1, "lastReportWatts": 211, "maxReportWatts": 243 }, { "serialNumber": "202043003123", "lastReportDate": 1692817816, "devType": 1, "lastReportWatts": 209, "maxReportWatts": 245 }, { "serialNumber": "202043002631", "lastReportDate": 1692817819, "devType": 1, "lastReportWatts": 212, "maxReportWatts": 243 } ] api_v1_production_inverters_log.json000066400000000000000000000005021464551303400353750ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:34 GMT", "content-type": "application/json", "content-length": "3325", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/api_v1_production_log.json000066400000000000000000000005011464551303400333520ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:34 GMT", "content-type": "application/json", "content-length": "115", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/info000066400000000000000000000041771464551303400270640ustar00rootroot00000000000000 122027033238 800-00555-r03 D7.3.517 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 b62bb8 590-00018-r01 02.00.01 426697 500-00002-r01 07.03.517 a5b17f 500-00004-r01 01.02.419 afbd20 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 480872 500-00012-r01 02.02.00 020101 500-00016-r01 02.00.00 54a6dc 500-00020-r01 22.13.09 ab8b4a 500-00021-r01 01.00.00 19ae14 500-00001-r01 02.00.00 1210 ec2-user-envoy_uber-pkg_master:pkg-Mar-28-23-21:17:00 1680038329 02.00.3983 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/info_log.json000066400000000000000000000005751464551303400306730ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:34 GMT", "content-type": "text/xml", "content-length": "2175", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ensemble_dry_contacts000066400000000000000000000005231464551303400333440ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "closed" }, { "id": "NC2", "status": "closed" }, { "id": "NO1", "status": "closed" }, { "id": "NO2", "status": "closed" } ] } ivp_ensemble_dry_contacts_log.json000066400000000000000000000004351464551303400351000ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:35 GMT", "content-length": "338", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ensemble_generator000066400000000000000000000002771464551303400326440ustar00rootroot00000000000000{ "admin_state": "unknown", "oper_state": "open", "admin_mode": 0, "schedule": 0, "start_soc": 100, "stop_soc": -1, "exc_on": 0, "present": 1, "type": 0 } ivp_ensemble_generator_log.json000066400000000000000000000004351464551303400343720ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:21:56 GMT", "content-length": "190", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ensemble_inventory000066400000000000000000000107751464551303400327170ustar00rootroot00000000000000[ { "type": "ENCHARGE", "devices": [ { "part_num": "830-00703-r67", "installed": 1692651649, "serial_num": "122035013273", "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1692817971, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1692651649, "img_load_date": 1692651649, "img_pnum_running": "2.0.5663_rel/22.13", "zigbee_dongle_fw_version": "100B", "bmu_fw_version": "2.1.27", "operating": true, "communicating": true, "sleep_enabled": false, "percentFull": 100, "temperature": 28, "maxCellTemp": 28, "comm_level_sub_ghz": 5, "comm_level_2_4_ghz": 5, "led_status": 14, "dc_switch_off": false, "encharge_rev": 1, "encharge_capacity": 3360 }, { "part_num": "830-00703-r67", "installed": 1692651650, "serial_num": "122035013278", "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1692817716, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1692651650, "img_load_date": 1692651650, "img_pnum_running": "2.0.5663_rel/22.13", "zigbee_dongle_fw_version": "100B", "bmu_fw_version": "2.1.27", "operating": true, "communicating": true, "sleep_enabled": false, "percentFull": 100, "temperature": 28, "maxCellTemp": 29, "comm_level_sub_ghz": 5, "comm_level_2_4_ghz": 5, "led_status": 14, "dc_switch_off": false, "encharge_rev": 1, "encharge_capacity": 3360 }, { "part_num": "830-00703-r67", "installed": 1692779890, "serial_num": "122035013286", "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1692817944, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1692779890, "img_load_date": 1692779890, "img_pnum_running": "2.0.5663_rel/22.13", "zigbee_dongle_fw_version": "100B", "bmu_fw_version": "2.1.27", "operating": true, "communicating": true, "sleep_enabled": false, "percentFull": 100, "temperature": 28, "maxCellTemp": 29, "comm_level_sub_ghz": 5, "comm_level_2_4_ghz": 5, "led_status": 14, "dc_switch_off": false, "encharge_rev": 1, "encharge_capacity": 3360 } ] }, { "type": "ENPOWER", "devices": [ { "part_num": "860-00276-r28", "installed": 1692651723, "serial_num": "122029016399", "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1692817873, "admin_state": 24, "admin_state_str": "ENPWR_STATE_OPER_CLOSED", "created_date": 1692651723, "img_load_date": 1692651723, "img_pnum_running": "1.5.5229_rel/22.13", "zigbee_dongle_fw_version": "100B", "operating": true, "communicating": true, "temperature": 88, "comm_level_sub_ghz": 5, "comm_level_2_4_ghz": 5, "mains_admin_state": "closed", "mains_oper_state": "closed", "Enpwr_grid_mode": "multimode-ongrid", "Enchg_grid_mode": "multimode-ongrid", "Enpwr_relay_state_bm": 15664, "Enpwr_curr_state_id": 16 } ] } ] ivp_ensemble_inventory_log.json000066400000000000000000000004361464551303400344420ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:35 GMT", "content-length": "4604", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ensemble_power000066400000000000000000000007541464551303400320120ustar00rootroot00000000000000{ "devices:": [ { "serial_num": "122035013273", "real_power_mw": 0, "apparent_power_mva": 0, "soc": 100 }, { "serial_num": "122035013278", "real_power_mw": 0, "apparent_power_mva": 0, "soc": 100 }, { "serial_num": "122035013286", "real_power_mw": 0, "apparent_power_mva": 0, "soc": 100 } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ensemble_power_log.json000066400000000000000000000004351464551303400336170ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:35 GMT", "content-length": "491", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ensemble_secctrl000066400000000000000000000013671464551303400323160ustar00rootroot00000000000000{ "shutdown": false, "freq_bias_hz": -1.3200000524520875, "voltage_bias_v": -16.0, "freq_bias_hz_q8": -2123, "voltage_bias_v_q5": -512, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 100, "adjusted_backup_soc": 100, "agg_soc": 100, "Max_energy": 10080, "ENC_agg_soc": 100, "ENC_agg_backup_energy": 10080, "ENC_agg_avail_energy": 10080, "Enc_commissioned_capacity": 10080, "Enc_max_available_capacity": 10080, "ACB_agg_soc": 0, "ACB_agg_energy": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ensemble_secctrl_log.json000066400000000000000000000004351464551303400341220ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:36 GMT", "content-length": "758", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ensemble_status000066400000000000000000000463421464551303400322040ustar00rootroot00000000000000{ "inventory": { "serial_nums": { "122029016399": { "device_type": 17, "admin_state": 24, "admin_state_str": "ENPWR_STATE_OPER_CLOSED", "msg_retry_count": 2, "part_number": "860-00276-r28", "assembly_number": "880-00981-r28", "app_fw_version": "1.5.5229_rel/22.13", "zb_fw_version": "100B", "zb_bootloader_vers": "1.8.1", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "", "bmu_fw_version": "", "submodule_count": 1, "submodules": { "122028018664": { "device_type": 18, "admin_state": 1, "part_number": "800-01306-r06", "assembly_number": "880-01306-r06", "dmir": { "part_number": "546-00003-01", "assembly_number": "01" }, "procload": { "part_number": "522-00003-01", "assembly_number": "1.5.5229_rel/22.13" } } } }, "122035013273": { "device_type": 13, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "multimode-ongrid", "phase": 1, "encharge_revision": 1, "encharge_capacity": 3360, "encharge_rated_power": 1280, "reported_enc_grid_state": "grid-tied", "msg_retry_count": 0, "part_number": "830-00703-r67", "assembly_number": "890-00020-r42", "app_fw_version": "2.0.5663_rel/22.13", "zb_fw_version": "100B", "zb_bootloader_vers": "1.8.1", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "2.1.27", "submodule_count": 6, "submodules": { "122033028286": { "device_type": 15, "admin_state": 1, "part_number": "800-01304-r06", "assembly_number": "880-01304-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "2.0.5663_rel/22.13" } }, "122033028845": { "device_type": 16, "admin_state": 1, "part_number": "620-00283-r06", "assembly_number": "800-00283-r06", "dmir": { "part_number": "", "assembly_number": "" }, "procload": { "part_number": "490-00154", "assembly_number": "2.1.27" } }, "122034045036": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034045262": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034054826": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034054904": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } } } }, "122035013278": { "device_type": 13, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "multimode-ongrid", "phase": 1, "encharge_revision": 1, "encharge_capacity": 3360, "encharge_rated_power": 1280, "reported_enc_grid_state": "grid-tied", "msg_retry_count": 0, "part_number": "830-00703-r67", "assembly_number": "890-00020-r42", "app_fw_version": "2.0.5663_rel/22.13", "zb_fw_version": "100B", "zb_bootloader_vers": "1.8.1", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "2.1.27", "submodule_count": 6, "submodules": { "122033028671": { "device_type": 15, "admin_state": 1, "part_number": "800-01304-r06", "assembly_number": "880-01304-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "2.0.5663_rel/22.13" } }, "122033028972": { "device_type": 16, "admin_state": 1, "part_number": "620-00283-r06", "assembly_number": "800-00283-r06", "dmir": { "part_number": "", "assembly_number": "" }, "procload": { "part_number": "490-00154", "assembly_number": "2.1.27" } }, "122034044640": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034045408": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034055224": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034055397": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } } } }, "122035013286": { "device_type": 13, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "multimode-ongrid", "phase": 1, "encharge_revision": 1, "encharge_capacity": 3360, "encharge_rated_power": 1280, "reported_enc_grid_state": "grid-tied", "msg_retry_count": 0, "part_number": "830-00703-r67", "assembly_number": "890-00020-r42", "app_fw_version": "2.0.5663_rel/22.13", "zb_fw_version": "100B", "zb_bootloader_vers": "1.8.1", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "2.1.27", "submodule_count": 6, "submodules": { "122033028343": { "device_type": 15, "admin_state": 1, "part_number": "800-01304-r06", "assembly_number": "880-01304-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "2.0.5663_rel/22.13" } }, "122033028869": { "device_type": 16, "admin_state": 1, "part_number": "620-00283-r06", "assembly_number": "800-00283-r06", "dmir": { "part_number": "", "assembly_number": "" }, "procload": { "part_number": "490-00154", "assembly_number": "2.1.27" } }, "122034044651": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034045492": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034055464": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122034055475": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } } } } } }, "counters": { "api_ecagtInit": 1, "api_ecagtTick": 598589, "api_ecagtDeviceInsert": 6, "api_ecagtDeviceNetworkStatus": 33251, "api_ecagtGetDeviceCount": 609035, "api_ecagtGetDeviceInfo": 608323, "api_ecagtGetOneDeviceInfo": 1710, "api_ecagtDevIdToSerial": 52526, "api_ecagtHandleMsg": 51808, "api_ecagtGetSubmoduleInv": 16524, "api_ecagtGetDataModelRaw": 47195, "api_ecagtSetSecCtrlBias": 55128, "api_ecagtGetSecCtrlBias": 978, "api_ecagtGetSecCtrlBiasQ": 978, "api_ecagtGetRelayState": 1203323, "api_ecagtSetDataModelCache": 1, "api_AggNameplate": 428, "api_ecagtGetGridFreq": 598589, "api_ecagtGetGridVolt": 598589, "api_ecagtGetGridFreq_err_oor": 312, "rest_StatusGet": 429, "rest_InventoryGet": 3019, "rest_SubmodGet": 3524, "rest_SecCtrlGet": 550, "rest_RelayGet": 2520, "rest_CommCheckGet": 2520, "rest_Power": 1772, "ext_zb_send_msg": 76593, "ext_cfg_save_device": 6, "ext_cfg_save_device_err": 6, "ext_send_perf_data": 33804, "ext_event_set_stateful": 210, "ext_event_set_modgone": 16, "rxmsg_OBJ_MDL_META_RSP": 5, "rxmsg_OBJ_MDL_INV_UPD_RSP": 440, "rxmsg_OBJ_MDL_POLL_RSP": 45551, "rxmsg_OBJ_MDL_RELAY_CTRL_RSP": 3, "rxmsg_OBJ_MDL_RELAY_STATUS_REQ": 5513, "rxmsg_OBJ_MDL_GRID_STATUS_RSP": 7, "rxmsg_OBJ_MDL_EVENTS_MSG": 147, "rxmsg_OBJ_MDL_SOC_CONFIG_RSP": 7, "rxmsg_OBJ_MDL_ERROR_DRY_CTRL_RSP": 16, "rxmsg_OBJ_MDL_ERROR_DRY_STATUS_RSP": 96, "txmsg_OBJ_MDL_META_REQ": 5, "txmsg_OBJ_MDL_ENP_RT_POLL_REQ": 12718, "txmsg_OBJ_MDL_BMU_POLL_REQ": 1493, "txmsg_OBJ_MDL_PCU_POLL_REQ": 1495, "txmsg_OBJ_MDL_SECONDARY_CTRL_REQ": 55098, "txmsg_OBJ_MDL_RELAY_CTRL_REQ": 3, "txmsg_OBJ_MDL_GRID_STATUS_REQ": 7, "txmsg_OBJ_MDL_RELAY_STATUS_RSP": 5500, "txmsg_OBJ_MDL_EVENTS_ACK": 147, "txmsg_OBJ_MDL_SOC_CONFIG_REQ": 7, "txmsg_OBJ_MDL_TNS_START": 8, "rxmsg_OBJ_MDL_TNS_START_RSP": 9, "txmsg_OBJ_MDL_SET_UDMIR": 8, "rxmsg_OBJ_MDL_SET_UDMIR_RSP": 6, "txmsg_OBJ_MDL_TNS_END": 8, "rxmsg_OBJ_MDL_TNS_END_RSP": 8, "zmq_ecaHello": 1, "zmq_ecaDevInfo": 9, "zmq_ecaNetworkStatus": 33251, "zmq_ecaAppMsg": 51814, "zmq_streamdata": 598589, "zmq_nameplate": 5, "zmq_ecaSecCtrlMsg": 55128, "zmq_meterlog_ok": 1, "dmdl_FILES_INDEXED": 3, "devPollMissing": 5243, "gridProfileTransaction": 16, "secctrlNotReady": 30, "profile_txn_ack": 8, "dry_contact_txn_retry_failure": 4, "dry_contact_txn_ack": 16, "backupSocLimitSet": 56208, "backupSocLimitChanged": 2, "api_ecagtGetGenRelayState": 598589 }, "secctrl": { "shutdown": false, "freq_bias_hz": -1.3200000524520875, "voltage_bias_v": -16.0, "freq_bias_hz_q8": -2123, "voltage_bias_v_q5": -512, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 100, "adjusted_backup_soc": 100, "agg_soc": 100, "Max_energy": 10080, "ENC_agg_soc": 100, "ENC_agg_backup_energy": 10080, "ENC_agg_avail_energy": 10080, "Enc_commissioned_capacity": 10080, "Enc_max_available_capacity": 10080, "ACB_agg_soc": 0, "ACB_agg_energy": 0 }, "relay": { "mains_admin_state": "closed", "mains_oper_state": "closed", "der1_state": 1, "der2_state": 0, "Enchg_grid_mode": "multimode-ongrid", "Solar_grid_mode": "multimode-ongrid" }, "profile": { "message": "Obsolete API, please use ivp/arf/profile" }, "fakeit": { "fake_inventory_mode": false } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ensemble_status_log.json000066400000000000000000000004371464551303400340100ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:35 GMT", "content-length": "19681", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_sc_pvlimit000066400000000000000000000000611464551303400311440ustar00rootroot00000000000000{ "enable": false, "pv_limit_pct": 100 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_sc_pvlimit_log.json000066400000000000000000000004341464551303400327610ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:37 GMT", "content-length": "48", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ss_dry_contact_settings000066400000000000000000000043421464551303400337370ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "type": "LOAD", "grid_action": "apply", "micro_grid_action": "shed", "gen_action": "shed", "essential_start_time": 32400.0, "essential_end_time": 57600.0, "priority": 1.0, "black_s_start": 5.0, "override": "true", "manual_override": "true", "load_name": "NC1 Test", "mode": "manual", "soc_low": 25.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NC2", "type": "LOAD", "grid_action": "apply", "micro_grid_action": "shed", "gen_action": "shed", "essential_start_time": 32400.0, "essential_end_time": 57600.0, "priority": 2.0, "black_s_start": 5.0, "override": "true", "manual_override": "true", "load_name": "NC2", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO1", "type": "LOAD", "grid_action": "shed", "micro_grid_action": "apply", "gen_action": "apply", "essential_start_time": 32400.0, "essential_end_time": 57600.0, "priority": 3.0, "black_s_start": 5.0, "override": "true", "manual_override": "true", "load_name": "No1", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO2", "type": "LOAD", "grid_action": "shed", "micro_grid_action": "apply", "gen_action": "apply", "essential_start_time": 32400.0, "essential_end_time": 57600.0, "priority": 4.0, "black_s_start": 5.0, "override": "true", "manual_override": "true", "load_name": "NO2", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] } ] } ivp_ss_dry_contact_settings_log.json000066400000000000000000000004361464551303400354710ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:36 GMT", "content-length": "2273", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ss_gen_config000066400000000000000000000000031464551303400315720ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ss_gen_config_log.json000066400000000000000000000004331464551303400334120ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:37 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ss_gen_schedule000066400000000000000000000000031464551303400321210ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ss_gen_schedule_log.json000066400000000000000000000004331464551303400337410ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:37 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ss_pel_settings000066400000000000000000000004621464551303400322050ustar00rootroot00000000000000{ "PEL": false, "Hard_PEL": false, "Soft_PEL": false, "Export_Limit_Type": "Aggregate", "percent": false, "apparent": false, "PEL_Limit": 0.0, "Comm_Time_Loss": 0.0, "Resp_Time_SoftPEL": 0.0, "Resp_Time_HardPEL": 0.0, "msReset_HardPEL": 0.0, "PEL_db": 0.0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/ivp_ss_pel_settings_log.json000066400000000000000000000004351464551303400340160ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:37 GMT", "content-length": "305", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/production000066400000000000000000000047721464551303400303200ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 22, "readingTime": 1692817988, "wNow": 4490, "whLifetime": 183353 }, { "type": "eim", "activeCount": 1, "measurementType": "production", "readingTime": 1692818015, "wNow": 4300.164, "whLifetime": 19230314.735, "varhLeadLifetime": 0.446, "varhLagLifetime": 9375571.84, "vahLifetime": 25459516.463, "rmsCurrent": 34.896, "rmsVoltage": 243.325, "reactPwr": 404.183, "apprntPwr": 4377.722, "pwrFactor": 0.99, "whToday": 18634.735, "whLastSevenDays": 218715.735, "vahToday": 22750.463, "varhLeadToday": 0.446, "varhLagToday": 6529.84 } ], "consumption": [ { "type": "eim", "activeCount": 1, "measurementType": "total-consumption", "readingTime": 1692818015, "wNow": 3802.98, "whLifetime": 27629800.274, "varhLeadLifetime": 13182910.902, "varhLagLifetime": -9185383.822, "vahLifetime": 35703441.771, "rmsCurrent": 24.973, "rmsVoltage": 243.174, "reactPwr": 119.982, "apprntPwr": 3036.232, "pwrFactor": 1.0, "whToday": 24293.274, "whLastSevenDays": 853.274, "vahToday": 20422.771, "varhLeadToday": 8438.902, "varhLagToday": 0.0 }, { "type": "eim", "activeCount": 1, "measurementType": "net-consumption", "readingTime": 1692818015, "wNow": -497.185, "whLifetime": 8436418.786, "varhLeadLifetime": 13182911.347, "varhLagLifetime": 190188.018, "vahLifetime": 35703441.771, "rmsCurrent": -9.923, "rmsVoltage": 243.174, "reactPwr": -284.201, "apprntPwr": -1206.704, "pwrFactor": -1.0, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/production.json000066400000000000000000000047751464551303400312730ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 22, "readingTime": 1692817988, "wNow": 4490, "whLifetime": 183353 }, { "type": "eim", "activeCount": 1, "measurementType": "production", "readingTime": 1692818014, "wNow": 4556.139, "whLifetime": 19230313.461, "varhLeadLifetime": 0.446, "varhLagLifetime": 9375571.716, "vahLifetime": 25459515.173, "rmsCurrent": 36.856, "rmsVoltage": 243.341, "reactPwr": 407.762, "apprntPwr": 4646.052, "pwrFactor": 0.98, "whToday": 18633.461, "whLastSevenDays": 218714.461, "vahToday": 22749.173, "varhLeadToday": 0.446, "varhLagToday": 6529.716 } ], "consumption": [ { "type": "eim", "activeCount": 1, "measurementType": "total-consumption", "readingTime": 1692818014, "wNow": 3791.075, "whLifetime": 27629799.104, "varhLeadLifetime": 13182910.813, "varhLagLifetime": -9185383.698, "vahLifetime": 35703441.404, "rmsCurrent": 25.982, "rmsVoltage": 243.198, "reactPwr": 120.73, "apprntPwr": 3159.183, "pwrFactor": 1.0, "whToday": 24292.104, "whLastSevenDays": 852.104, "vahToday": 20422.404, "varhLeadToday": 8438.813, "varhLagToday": 0.0 }, { "type": "eim", "activeCount": 1, "measurementType": "net-consumption", "readingTime": 1692818014, "wNow": -765.064, "whLifetime": 8436418.891, "varhLeadLifetime": 13182911.259, "varhLagLifetime": 190188.018, "vahLifetime": 35703441.404, "rmsCurrent": -10.874, "rmsVoltage": 243.198, "reactPwr": -287.032, "apprntPwr": -1322.483, "pwrFactor": -1.0, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/production.json_log.json000066400000000000000000000006131464551303400330670ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:35 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_legacy_savings_mode/production_log.json000066400000000000000000000006131464551303400321170ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 23 Aug 2023 19:13:35 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/000077500000000000000000000000001464551303400237405ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/admin_lib_tariff000066400000000000000000000324561464551303400271460ustar00rootroot00000000000000{ "tariff": { "currency": { "code": "USD" }, "logger": "mylogger", "date": "1693461802", "storage_settings": { "mode": "self-consumption", "operation_mode_sub_type": "", "reserved_soc": 20.0, "very_low_soc": 10, "charge_from_grid": false, "date": "1693461802" }, "single_rate": { "rate": 0.183109, "sell": 0.183109 }, "seasons": [ { "id": "summer", "start": "6/1", "days": [ { "id": "weekdays", "days": "Mon,Tue,Wed,Thu,Fri", "must_charge_start": 0, "must_charge_duration": 0, "must_charge_mode": "CP", "enable_discharge_to_grid": false, "periods": [ { "id": "filler", "start": 0, "rate": 0.183109 }, { "id": "period_1", "start": 1020, "rate": 0.24488 }, { "id": "filler", "start": 1200, "rate": 0.183109 } ] }, { "id": "weekend", "days": "Sat,Sun", "must_charge_start": 0, "must_charge_duration": 0, "must_charge_mode": "CP", "enable_discharge_to_grid": false, "periods": [ { "id": "period_1", "start": 0, "rate": 0.183109 }, { "id": "filler", "start": 1439, "rate": 0.0 } ] } ], "tiers": [] }, { "id": "winter", "start": "10/1", "days": [ { "id": "weekdays", "days": "Mon,Tue,Wed,Thu,Fri", "must_charge_start": 0, "must_charge_duration": 0, "must_charge_mode": "CP", "enable_discharge_to_grid": false, "periods": [ { "id": "filler", "start": 0, "rate": 0.185529 }, { "id": "period_1", "start": 1020, "rate": 0.196829 }, { "id": "filler", "start": 1200, "rate": 0.185529 } ] }, { "id": "weekend", "days": "Sat,Sun", "must_charge_start": 0, "must_charge_duration": 0, "must_charge_mode": "CP", "enable_discharge_to_grid": false, "periods": [ { "id": "period_1", "start": 0, "rate": 0.185529 }, { "id": "filler", "start": 1439, "rate": 0.0 } ] } ], "tiers": [] } ], "seasons_sell": [ { "id": "summer", "start": "6/1", "days": [ { "id": "weekdays", "days": "Mon,Tue,Wed,Thu,Fri", "periods": [ { "id": "filler", "start": 0, "rate": 0.183109 }, { "id": "period_1", "start": 1020, "rate": 0.24488 }, { "id": "filler", "start": 1200, "rate": 0.183109 } ] }, { "id": "weekend", "days": "Sat,Sun", "periods": [ { "id": "period_1", "start": 0, "rate": 0.183109 }, { "id": "filler", "start": 1439, "rate": 0.0 } ] } ] }, { "id": "winter", "start": "10/1", "days": [ { "id": "weekdays", "days": "Mon,Tue,Wed,Thu,Fri", "periods": [ { "id": "filler", "start": 0, "rate": 0.185529 }, { "id": "period_1", "start": 1020, "rate": 0.196829 }, { "id": "filler", "start": 1200, "rate": 0.185529 } ] }, { "id": "weekend", "days": "Sat,Sun", "periods": [ { "id": "period_1", "start": 0, "rate": 0.185529 }, { "id": "filler", "start": 1439, "rate": 0.0 } ] } ] } ] }, "schedule": { "source": "Tariff", "date": "2023-08-31 06:04:08 UTC", "version": "00.00.02", "reserved_soc": 20.0, "operation_mode_sub_type": "", "very_low_soc": 10, "charge_from_grid": false, "battery_mode": "self-consumption", "schedule": { "Disable": [ { "Sun": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Mon": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Tue": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Wed": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Thu": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Fri": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Sat": [ { "start": 0, "duration": 1440, "setting": "ID" } ] } ], "tariff": [ { "start": "6/1", "end": "10/1", "Sun": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Mon": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Tue": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Wed": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Thu": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Fri": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Sat": [ { "start": 0, "duration": 1440, "setting": "ZN" } ] }, { "start": "10/1", "end": "6/1", "Sun": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Mon": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Tue": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Wed": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Thu": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Fri": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Sat": [ { "start": 0, "duration": 1440, "setting": "ZN" } ] } ] }, "override": false, "override_backup_soc": 30.0, "override_chg_dischg_rate": 0.0, "override_tou_mode": "StorageTouMode_DEFAULT_TOU_MODE" } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/admin_lib_tariff_log.json000066400000000000000000000006131464551303400307450ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:45 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/api_v1_production000066400000000000000000000001651464551303400273120ustar00rootroot00000000000000{ "wattHoursToday": 11149, "wattHoursSevenDays": 18431000, "wattHoursLifetime": 18442149, "wattsNow": 2683 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/api_v1_production_inverters000066400000000000000000000036551464551303400314220ustar00rootroot00000000000000[ { "serialNumber": "122004028996", "lastReportDate": 1694553546, "devType": 1, "lastReportWatts": 232, "maxReportWatts": 296 }, { "serialNumber": "122004027913", "lastReportDate": 1694553576, "devType": 1, "lastReportWatts": 230, "maxReportWatts": 296 }, { "serialNumber": "122004028206", "lastReportDate": 1694553697, "devType": 1, "lastReportWatts": 129, "maxReportWatts": 295 }, { "serialNumber": "122004039060", "lastReportDate": 1694553698, "devType": 1, "lastReportWatts": 231, "maxReportWatts": 296 }, { "serialNumber": "122004028288", "lastReportDate": 1694553606, "devType": 1, "lastReportWatts": 263, "maxReportWatts": 296 }, { "serialNumber": "122004028991", "lastReportDate": 1694553699, "devType": 1, "lastReportWatts": 268, "maxReportWatts": 297 }, { "serialNumber": "122004028286", "lastReportDate": 1694553702, "devType": 1, "lastReportWatts": 229, "maxReportWatts": 296 }, { "serialNumber": "122004028091", "lastReportDate": 1694553426, "devType": 1, "lastReportWatts": 13, "maxReportWatts": 296 }, { "serialNumber": "122004032100", "lastReportDate": 1694553549, "devType": 1, "lastReportWatts": 170, "maxReportWatts": 244 }, { "serialNumber": "122004028400", "lastReportDate": 1694553427, "devType": 1, "lastReportWatts": 177, "maxReportWatts": 286 }, { "serialNumber": "122004028989", "lastReportDate": 1694553456, "devType": 1, "lastReportWatts": 266, "maxReportWatts": 296 }, { "serialNumber": "122004031655", "lastReportDate": 1694553607, "devType": 1, "lastReportWatts": 268, "maxReportWatts": 296 }, { "serialNumber": "122004032124", "lastReportDate": 1694553457, "devType": 1, "lastReportWatts": 199, "maxReportWatts": 297 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/api_v1_production_inverters_log.json000066400000000000000000000005021464551303400332170ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:41 GMT", "content-type": "application/json", "content-length": "1965", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/api_v1_production_log.json000066400000000000000000000005011464551303400311150ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:41 GMT", "content-type": "application/json", "content-length": "117", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/info000066400000000000000000000041771464551303400246270ustar00rootroot00000000000000 122024013725 800-00555-r03 D7.3.517 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 b62bb8 590-00018-r01 02.00.01 426697 500-00002-r01 07.03.517 a5b17f 500-00004-r01 01.02.419 afbd20 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 480872 500-00012-r01 02.02.00 020101 500-00016-r01 02.00.00 54a6dc 500-00020-r01 22.13.09 ab8b4a 500-00021-r01 01.00.00 19ae14 500-00001-r01 02.00.00 1210 ec2-user-envoy_uber-pkg_master:pkg-Mar-28-23-21:17:00 1680038329 02.00.3983 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/info_log.json000066400000000000000000000005751464551303400264360ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:41 GMT", "content-type": "text/xml", "content-length": "2175", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ensemble_dry_contacts000066400000000000000000000005131464551303400311060ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "open" }, { "id": "NC2", "status": "open" }, { "id": "NO1", "status": "open" }, { "id": "NO2", "status": "open" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ensemble_dry_contacts_log.json000066400000000000000000000004351464551303400327220ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:44 GMT", "content-length": "330", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ensemble_generator000066400000000000000000000002771464551303400304070ustar00rootroot00000000000000{ "admin_state": "unknown", "oper_state": "open", "admin_mode": 0, "schedule": 0, "start_soc": 100, "stop_soc": -1, "exc_on": 0, "present": 1, "type": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ensemble_generator_log.json000066400000000000000000000004351464551303400322140ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:46 GMT", "content-length": "190", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ensemble_inventory000066400000000000000000000107701464551303400304550ustar00rootroot00000000000000[ { "type": "ENCHARGE", "devices": [ { "part_num": "830-00703-r64", "installed": 1693554929, "serial_num": "122031000212", "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1694553651, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1693554929, "img_load_date": 1693554929, "img_pnum_running": "2.0.5663_rel/22.13", "zigbee_dongle_fw_version": "100B", "bmu_fw_version": "2.1.27", "operating": true, "communicating": true, "sleep_enabled": false, "percentFull": 96, "temperature": 25, "maxCellTemp": 25, "comm_level_sub_ghz": 3, "comm_level_2_4_ghz": 3, "led_status": 12, "dc_switch_off": false, "encharge_rev": 1, "encharge_capacity": 3360 }, { "part_num": "830-00703-r64", "installed": 1693576648, "serial_num": "122031000215", "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1694553547, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1693576648, "img_load_date": 1693576648, "img_pnum_running": "2.0.5663_rel/22.13", "zigbee_dongle_fw_version": "100B", "bmu_fw_version": "2.1.27", "operating": true, "communicating": true, "sleep_enabled": false, "percentFull": 97, "temperature": 25, "maxCellTemp": 26, "comm_level_sub_ghz": 3, "comm_level_2_4_ghz": 3, "led_status": 12, "dc_switch_off": false, "encharge_rev": 1, "encharge_capacity": 3360 }, { "part_num": "830-00703-r64", "installed": 1694098472, "serial_num": "122031023943", "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1694553574, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1694098472, "img_load_date": 1694098472, "img_pnum_running": "2.0.5663_rel/22.13", "zigbee_dongle_fw_version": "100B", "bmu_fw_version": "2.1.27", "operating": true, "communicating": true, "sleep_enabled": false, "percentFull": 96, "temperature": 25, "maxCellTemp": 26, "comm_level_sub_ghz": 4, "comm_level_2_4_ghz": 4, "led_status": 12, "dc_switch_off": false, "encharge_rev": 1, "encharge_capacity": 3360 } ] }, { "type": "ENPOWER", "devices": [ { "part_num": "860-00276-r33", "installed": 1688303357, "serial_num": "122036058363", "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1694553566, "admin_state": 24, "admin_state_str": "ENPWR_STATE_OPER_CLOSED", "created_date": 1688303357, "img_load_date": 1688303357, "img_pnum_running": "1.5.5229_rel/22.13", "zigbee_dongle_fw_version": "100B", "operating": true, "communicating": true, "temperature": 78, "comm_level_sub_ghz": 2, "comm_level_2_4_ghz": 2, "mains_admin_state": "closed", "mains_oper_state": "closed", "Enpwr_grid_mode": "multimode-ongrid", "Enchg_grid_mode": "multimode-ongrid", "Enpwr_relay_state_bm": 304, "Enpwr_curr_state_id": 16 } ] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ensemble_inventory_log.json000066400000000000000000000004361464551303400322640ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:44 GMT", "content-length": "4599", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ensemble_power000066400000000000000000000010151464551303400275440ustar00rootroot00000000000000{ "devices:": [ { "serial_num": "122031000212", "real_power_mw": -676000, "apparent_power_mva": -676000, "soc": 96 }, { "serial_num": "122031000215", "real_power_mw": -680000, "apparent_power_mva": -680000, "soc": 97 }, { "serial_num": "122031023943", "real_power_mw": -676000, "apparent_power_mva": -676000, "soc": 96 } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ensemble_power_log.json000066400000000000000000000004351464551303400313620ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:44 GMT", "content-length": "524", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ensemble_secctrl000066400000000000000000000013761464551303400300610ustar00rootroot00000000000000{ "shutdown": false, "freq_bias_hz": -0.6863999962806702, "voltage_bias_v": -8.319999694824219, "freq_bias_hz_q8": -1104, "voltage_bias_v_q5": -266, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 20, "adjusted_backup_soc": 20, "agg_soc": 96, "Max_energy": 10080, "ENC_agg_soc": 96, "ENC_agg_backup_energy": 2016, "ENC_agg_avail_energy": 9710, "Enc_commissioned_capacity": 10080, "Enc_max_available_capacity": 10080, "ACB_agg_soc": 0, "ACB_agg_energy": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ensemble_secctrl_log.json000066400000000000000000000004351464551303400316650ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:44 GMT", "content-length": "765", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ensemble_status000066400000000000000000000471211464551303400277430ustar00rootroot00000000000000{ "inventory": { "serial_nums": { "122031000212": { "device_type": 13, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "multimode-ongrid", "phase": 1, "encharge_revision": 1, "encharge_capacity": 3360, "encharge_rated_power": 1280, "reported_enc_grid_state": "grid-tied", "msg_retry_count": 3, "part_number": "830-00703-r64", "assembly_number": "890-00020-r38", "app_fw_version": "2.0.5663_rel/22.13", "zb_fw_version": "100B", "zb_bootloader_vers": "1.8.1", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "2.1.27", "submodule_count": 6, "submodules": { "122029042019": { "device_type": 15, "admin_state": 1, "part_number": "800-01304-r06", "assembly_number": "880-01304-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "2.0.5663_rel/22.13" } }, "122029053332": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122029057798": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122029057913": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122029058447": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122030052698": { "device_type": 16, "admin_state": 1, "part_number": "620-00283-r06", "assembly_number": "800-00283-r06", "dmir": { "part_number": "", "assembly_number": "" }, "procload": { "part_number": "490-00154", "assembly_number": "2.1.27" } } } }, "122031000215": { "device_type": 13, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "multimode-ongrid", "phase": 1, "encharge_revision": 1, "encharge_capacity": 3360, "encharge_rated_power": 1280, "reported_enc_grid_state": "grid-tied", "msg_retry_count": 1, "part_number": "830-00703-r64", "assembly_number": "890-00020-r38", "app_fw_version": "2.0.5663_rel/22.13", "zb_fw_version": "100B", "zb_bootloader_vers": "1.8.1", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "2.1.27", "submodule_count": 6, "submodules": { "122029042177": { "device_type": 15, "admin_state": 1, "part_number": "800-01304-r06", "assembly_number": "880-01304-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "2.0.5663_rel/22.13" } }, "122029053372": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122029053640": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122029058477": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122029058689": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122030052697": { "device_type": 16, "admin_state": 1, "part_number": "620-00283-r06", "assembly_number": "800-00283-r06", "dmir": { "part_number": "", "assembly_number": "" }, "procload": { "part_number": "490-00154", "assembly_number": "2.1.27" } } } }, "122031023943": { "device_type": 13, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "multimode-ongrid", "phase": 1, "encharge_revision": 1, "encharge_capacity": 3360, "encharge_rated_power": 1280, "reported_enc_grid_state": "grid-tied", "msg_retry_count": 4, "part_number": "830-00703-r64", "assembly_number": "890-00020-r38", "app_fw_version": "2.0.5663_rel/22.13", "zb_fw_version": "100B", "zb_bootloader_vers": "1.8.1", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "2.1.27", "submodule_count": 6, "submodules": { "122031005827": { "device_type": 15, "admin_state": 1, "part_number": "800-01304-r06", "assembly_number": "880-01304-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "2.0.5663_rel/22.13" } }, "122031008748": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122031008801": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122031008829": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122031008920": { "device_type": 14, "admin_state": 1, "part_number": "800-01318-r01", "assembly_number": "880-00973-r10", "dmir": { "part_number": "549-00008-r00", "assembly_number": "3.24.4-D40" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.24.1-D40" } }, "122031014312": { "device_type": 16, "admin_state": 1, "part_number": "620-00283-r06", "assembly_number": "800-00283-r06", "dmir": { "part_number": "", "assembly_number": "" }, "procload": { "part_number": "490-00154", "assembly_number": "2.1.27" } } } }, "122036058363": { "device_type": 17, "admin_state": 24, "admin_state_str": "ENPWR_STATE_OPER_CLOSED", "msg_retry_count": 4, "part_number": "860-00276-r33", "assembly_number": "880-00981-r33", "app_fw_version": "1.5.5229_rel/22.13", "zb_fw_version": "100B", "zb_bootloader_vers": "1.8.1", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "", "bmu_fw_version": "", "submodule_count": 1, "submodules": { "122035051385": { "device_type": 18, "admin_state": 1, "part_number": "800-01306-r06", "assembly_number": "880-01306-r06", "dmir": { "part_number": "546-00003-01", "assembly_number": "01" }, "procload": { "part_number": "522-00003-01", "assembly_number": "1.5.5229_rel/22.13" } } } } } }, "counters": { "api_ecagtInit": 1, "api_ecagtTick": 22579528, "api_ecagtDeviceInsert": 13, "api_ecagtDeviceNetworkStatus": 1249353, "api_ecagtGetDeviceCount": 22683300, "api_ecagtGetDeviceInfo": 22657104, "api_ecagtGetOneDeviceInfo": 64475, "api_ecagtDevIdToSerial": 1955692, "api_ecagtHandleMsg": 1929493, "api_ecagtGetSubmoduleInv": 245248, "api_ecagtGetDataModelRaw": 1106007, "api_ecagtSetSecCtrlBias": 2071262, "api_ecagtGetSecCtrlBias": 32297, "api_ecagtGetSecCtrlBiasQ": 32297, "api_ecagtGetRelayState": 45197926, "api_ecagtSetDataModelCache": 1, "api_AggNameplate": 16119, "api_ecagtGetGridFreq": 22579528, "api_ecagtGetGridVolt": 22579528, "api_ecagtGetGridFreq_err_oor": 11041, "rest_StatusGet": 16120, "rest_InventoryGet": 16190, "rest_SubmodGet": 38643, "rest_SecCtrlGet": 16178, "rest_RelayGet": 12, "rest_CommCheckGet": 12, "rest_Power": 64535, "ext_zb_send_msg": 2875502, "ext_cfg_save_device": 13, "ext_cfg_save_device_err": 13, "ext_send_perf_data": 1271522, "ext_notify_grid_outage": 2, "ext_event_set_stateful": 975, "ext_event_set_modgone": 66, "rxmsg_OBJ_MDL_META_RSP": 13, "rxmsg_OBJ_MDL_INV_UPD_RSP": 2038, "rxmsg_OBJ_MDL_POLL_RSP": 1718856, "rxmsg_OBJ_MDL_RELAY_CTRL_RSP": 9, "rxmsg_OBJ_MDL_RELAY_STATUS_REQ": 207725, "rxmsg_OBJ_MDL_GRID_STATUS_RSP": 29, "rxmsg_OBJ_MDL_EVENTS_MSG": 541, "rxmsg_OBJ_MDL_SOC_CONFIG_RSP": 46, "rxmsg_OBJ_MDL_ERROR_DRY_CTRL_RSP": 2, "rxmsg_OBJ_MDL_ERROR_DRY_STATUS_RSP": 63, "txmsg_OBJ_MDL_META_REQ": 19, "txmsg_OBJ_MDL_ENC_RT_POLL_REQ": 41, "txmsg_OBJ_MDL_ENP_RT_POLL_REQ": 482830, "txmsg_OBJ_MDL_BMU_POLL_REQ": 56390, "txmsg_OBJ_MDL_PCU_POLL_REQ": 56392, "txmsg_OBJ_MDL_SECONDARY_CTRL_REQ": 2071242, "txmsg_OBJ_MDL_RELAY_CTRL_REQ": 12, "txmsg_OBJ_MDL_GRID_STATUS_REQ": 35, "txmsg_OBJ_MDL_RELAY_STATUS_RSP": 207718, "txmsg_OBJ_MDL_EVENTS_ACK": 541, "txmsg_OBJ_MDL_SOC_CONFIG_REQ": 46, "txmsg_OBJ_MDL_TNS_START": 16, "rxmsg_OBJ_MDL_TNS_START_RSP": 16, "txmsg_OBJ_MDL_SET_UDMIR": 6, "rxmsg_OBJ_MDL_SET_UDMIR_RSP": 7, "txmsg_OBJ_MDL_TNS_END": 17, "rxmsg_OBJ_MDL_TNS_END_RSP": 16, "zmq_ecaHello": 1, "zmq_ecaDevInfo": 51, "zmq_ecaNetworkStatus": 1249353, "zmq_ecaAppMsg": 1929496, "zmq_streamdata": 22579528, "zmq_eca_live_debug_req": 24, "zmq_nameplate": 2242, "zmq_ecaSecCtrlMsg": 2071262, "zmq_meterlog_ok": 5, "dmdl_FILES_INDEXED": 3, "devPollMissing": 98517, "devMsgRspMissing": 2, "gridProfileTransaction": 33, "secctrlNotReady": 20, "fsm_retry_timeout": 20, "profile_txn_ack": 16, "dry_contact_txn_retry_failure": 2, "dry_contact_txn_ack": 2, "backupSocLimitSet": 2112082, "backupSocLimitChanged": 8, "api_ecagtGetGenRelayState": 22579528, "rxmsg_OBJ_MDL_SAMPLE_TAPE_RSP": 132, "txmsg_OBJ_MDL_SAMPLE_TAPE_RSP_ACK": 132 }, "secctrl": { "shutdown": false, "freq_bias_hz": -0.6863999962806702, "voltage_bias_v": -8.319999694824219, "freq_bias_hz_q8": -1104, "voltage_bias_v_q5": -266, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 20, "adjusted_backup_soc": 20, "agg_soc": 96, "Max_energy": 10080, "ENC_agg_soc": 96, "ENC_agg_backup_energy": 2016, "ENC_agg_avail_energy": 9710, "Enc_commissioned_capacity": 10080, "Enc_max_available_capacity": 10080, "ACB_agg_soc": 0, "ACB_agg_energy": 0 }, "relay": { "mains_admin_state": "closed", "mains_oper_state": "closed", "der1_state": 1, "der2_state": 0, "Enchg_grid_mode": "multimode-ongrid", "Solar_grid_mode": "multimode-ongrid" }, "profile": { "message": "Obsolete API, please use ivp/arf/profile" }, "fakeit": { "fake_inventory_mode": false } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ensemble_status_log.json000066400000000000000000000004371464551303400315530ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:44 GMT", "content-length": "20048", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_meters000066400000000000000000000007121464551303400260400ustar00rootroot00000000000000[ { "eid": 704643328, "state": "enabled", "measurementType": "production", "phaseMode": "split", "phaseCount": 2, "meteringStatus": "normal", "statusFlags": [] }, { "eid": 704643584, "state": "enabled", "measurementType": "net-consumption", "phaseMode": "split", "phaseCount": 2, "meteringStatus": "normal", "statusFlags": [] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_meters_log.json000066400000000000000000000004351464551303400276530ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:46 GMT", "content-length": "457", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_meters_readings000066400000000000000000000114331464551303400277160ustar00rootroot00000000000000[ { "eid": 704643328, "timestamp": 1694553765, "actEnergyDlvd": 18442496.933, "actEnergyRcvd": 0.069, "apparentEnergy": 21988447.961, "reactEnergyLagg": 3641536.995, "reactEnergyLead": 236029.320, "instantaneousDemand": 2659.845, "activePower": 2659.845, "apparentPower": 2661.490, "reactivePower": 16.667, "pwrFactor": 1.000, "voltage": 244.845, "current": 21.736, "freq": 60.000, "channels": [ { "eid": 1778385169, "timestamp": 1694553765, "actEnergyDlvd": 9224604.961, "actEnergyRcvd": 0.018, "apparentEnergy": 10992997.506, "reactEnergyLagg": 1823613.307, "reactEnergyLead": 113311.010, "instantaneousDemand": 1330.866, "activePower": 1330.866, "apparentPower": 1331.981, "reactivePower": 8.891, "pwrFactor": 1.000, "voltage": 122.565, "current": 10.865, "freq": 60.000 }, { "eid": 1778385170, "timestamp": 1694553765, "actEnergyDlvd": 9217891.972, "actEnergyRcvd": 0.051, "apparentEnergy": 10995450.455, "reactEnergyLagg": 1817923.688, "reactEnergyLead": 122718.310, "instantaneousDemand": 1328.979, "activePower": 1328.979, "apparentPower": 1329.509, "reactivePower": 7.776, "pwrFactor": 1.000, "voltage": 122.280, "current": 10.871, "freq": 60.000 }, { "eid": 1778385171, "timestamp": 1694553765, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 0.000, "current": 0.000, "freq": 60.000 } ] }, { "eid": 704643584, "timestamp": 1694553765, "actEnergyDlvd": 4873881.221, "actEnergyRcvd": 7554062.483, "apparentEnergy": 18779628.396, "reactEnergyLagg": 499906.036, "reactEnergyLead": 7629596.279, "instantaneousDemand": 23.172, "activePower": 23.172, "apparentPower": 364.999, "reactivePower": -240.223, "pwrFactor": 0.031, "voltage": 245.008, "current": 2.985, "freq": 60.000, "channels": [ { "eid": 1778385425, "timestamp": 1694553765, "actEnergyDlvd": 3374056.076, "actEnergyRcvd": 3340639.336, "apparentEnergy": 9863909.676, "reactEnergyLagg": 50177.337, "reactEnergyLead": 4264141.719, "instantaneousDemand": -17.438, "activePower": -17.438, "apparentPower": 143.478, "reactivePower": -95.235, "pwrFactor": -0.154, "voltage": 122.634, "current": 1.180, "freq": 60.000 }, { "eid": 1778385426, "timestamp": 1694553765, "actEnergyDlvd": 1499825.145, "actEnergyRcvd": 4213423.147, "apparentEnergy": 8915718.719, "reactEnergyLagg": 449728.699, "reactEnergyLead": 3365454.560, "instantaneousDemand": 40.610, "activePower": 40.610, "apparentPower": 221.521, "reactivePower": -144.988, "pwrFactor": 0.150, "voltage": 122.375, "current": 1.806, "freq": 60.000 }, { "eid": 1778385427, "timestamp": 1694553765, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 0.000, "current": 0.000, "freq": 60.000 } ] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_meters_readings_log.json000066400000000000000000000004361464551303400315300ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:46 GMT", "content-length": "4890", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_sc_pvlimit000066400000000000000000000000611464551303400267070ustar00rootroot00000000000000{ "enable": false, "pv_limit_pct": 100 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_sc_pvlimit_log.json000066400000000000000000000004341464551303400305240ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:46 GMT", "content-length": "48", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ss_dry_contact_settings000066400000000000000000000027271464551303400315070ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NC2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ss_dry_contact_settings_log.json000066400000000000000000000004361464551303400333130ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:44 GMT", "content-length": "1494", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ss_gen_config000066400000000000000000000000031464551303400273350ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ss_gen_config_log.json000066400000000000000000000004331464551303400311550ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:46 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ss_gen_schedule000066400000000000000000000000031464551303400276640ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ss_gen_schedule_log.json000066400000000000000000000004331464551303400315040ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:46 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ss_pel_settings000066400000000000000000000000251464551303400277430ustar00rootroot00000000000000{ "PEL": false } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/ivp_ss_pel_settings_log.json000066400000000000000000000004341464551303400315600ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:46 GMT", "content-length": "20", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/production000066400000000000000000000027041464551303400260540ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":13,"readingTime":1694553761,"wNow":2675,"whLifetime":640883},{"type":"eim","activeCount":1,"measurementType":"production","readingTime":1694553764,"wNow":2662.759,"whLifetime":18442495.381,"varhLeadLifetime":236029.32,"varhLagLifetime":3641536.985,"vahLifetime":21988446.409,"rmsCurrent":21.74,"rmsVoltage":245.013,"reactPwr":17.607,"apprntPwr":2663.609,"pwrFactor":1.0,"whToday":11495.381,"whLastSevenDays":18431346.381,"vahToday":13610.409,"varhLeadToday":0.32,"varhLagToday":2248.985}],"consumption":[{"type":"eim","activeCount":1,"measurementType":"total-consumption","readingTime":1694553764,"wNow":2710.147,"whLifetime":15745051.466,"varhLeadLifetime":7393566.818,"varhLagLifetime":-3141630.95,"vahLifetime":18779628.184,"rmsCurrent":22.409,"rmsVoltage":245.123,"reactPwr":-223.281,"apprntPwr":2746.045,"pwrFactor":0.99,"whToday":12902.466,"whLastSevenDays":349.466,"vahToday":7275.184,"varhLeadToday":5177.818,"varhLagToday":0.0},{"type":"eim","activeCount":1,"measurementType":"net-consumption","readingTime":1694553764,"wNow":47.388,"whLifetime":-2662918.623,"varhLeadLifetime":7629596.139,"varhLagLifetime":499906.036,"vahLifetime":18779628.184,"rmsCurrent":0.669,"rmsVoltage":245.123,"reactPwr":-240.888,"apprntPwr":81.535,"pwrFactor":0.55,"whToday":0,"whLastSevenDays":0,"vahToday":0,"varhLeadToday":0,"varhLagToday":0}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/production.json000066400000000000000000000027051464551303400270250ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":13,"readingTime":1694553761,"wNow":2675,"whLifetime":640883},{"type":"eim","activeCount":1,"measurementType":"production","readingTime":1694553763,"wNow":2663.075,"whLifetime":18442494.567,"varhLeadLifetime":236029.32,"varhLagLifetime":3641536.981,"vahLifetime":21988445.596,"rmsCurrent":21.736,"rmsVoltage":245.138,"reactPwr":18.766,"apprntPwr":2664.473,"pwrFactor":1.0,"whToday":11494.567,"whLastSevenDays":18431345.567,"vahToday":13609.596,"varhLeadToday":0.32,"varhLagToday":2248.981}],"consumption":[{"type":"eim","activeCount":1,"measurementType":"total-consumption","readingTime":1694553763,"wNow":2712.776,"whLifetime":15745050.638,"varhLeadLifetime":7393566.746,"varhLagLifetime":-3141630.945,"vahLifetime":18779628.073,"rmsCurrent":22.422,"rmsVoltage":245.187,"reactPwr":-221.854,"apprntPwr":2748.29,"pwrFactor":0.99,"whToday":12901.638,"whLastSevenDays":348.638,"vahToday":7275.073,"varhLeadToday":5177.746,"varhLagToday":0.0},{"type":"eim","activeCount":1,"measurementType":"net-consumption","readingTime":1694553763,"wNow":49.701,"whLifetime":-2662918.637,"varhLeadLifetime":7629596.066,"varhLagLifetime":499906.036,"vahLifetime":18779628.073,"rmsCurrent":0.686,"rmsVoltage":245.187,"reactPwr":-240.621,"apprntPwr":83.613,"pwrFactor":0.56,"whToday":0,"whLastSevenDays":0,"vahToday":0,"varhLeadToday":0,"varhLagToday":0}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/production.json_log.json000066400000000000000000000006131464551303400306320ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:43 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.3.517_system_2/production_log.json000066400000000000000000000006131464551303400276620ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 12 Sep 2023 21:22:44 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/000077500000000000000000000000001464551303400245435ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/api_v1_production000066400000000000000000000001611464551303400301110ustar00rootroot00000000000000{ "wattHoursToday": 10363, "wattHoursSevenDays": 101742, "wattHoursLifetime": 1544282, "wattsNow": 586 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/api_v1_production_inverters000066400000000000000000000036411464551303400322200ustar00rootroot00000000000000[ { "serialNumber": "482305021663", "lastReportDate": 1691412935, "devType": 1, "lastReportWatts": 48, "maxReportWatts": 329 }, { "serialNumber": "482305022836", "lastReportDate": 1691412935, "devType": 1, "lastReportWatts": 39, "maxReportWatts": 330 }, { "serialNumber": "482305023640", "lastReportDate": 1691412965, "devType": 1, "lastReportWatts": 50, "maxReportWatts": 330 }, { "serialNumber": "482306060958", "lastReportDate": 1691412754, "devType": 1, "lastReportWatts": 47, "maxReportWatts": 330 }, { "serialNumber": "482306074560", "lastReportDate": 1691412755, "devType": 1, "lastReportWatts": 48, "maxReportWatts": 330 }, { "serialNumber": "482306075432", "lastReportDate": 1691412757, "devType": 1, "lastReportWatts": 46, "maxReportWatts": 330 }, { "serialNumber": "482306075729", "lastReportDate": 1691412758, "devType": 1, "lastReportWatts": 48, "maxReportWatts": 330 }, { "serialNumber": "482306076034", "lastReportDate": 1691412759, "devType": 1, "lastReportWatts": 48, "maxReportWatts": 330 }, { "serialNumber": "482306083701", "lastReportDate": 1691412936, "devType": 1, "lastReportWatts": 48, "maxReportWatts": 330 }, { "serialNumber": "482306083705", "lastReportDate": 1691412937, "devType": 1, "lastReportWatts": 33, "maxReportWatts": 329 }, { "serialNumber": "482306083763", "lastReportDate": 1691412760, "devType": 1, "lastReportWatts": 47, "maxReportWatts": 330 }, { "serialNumber": "482306083851", "lastReportDate": 1691412938, "devType": 1, "lastReportWatts": 44, "maxReportWatts": 330 }, { "serialNumber": "482306101590", "lastReportDate": 1691412939, "devType": 1, "lastReportWatts": 40, "maxReportWatts": 330 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/api_v1_production_inverters_log.json000066400000000000000000000005541464551303400340310ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 12:58:01 GMT", "content-type": "application/json", "content-length": "1953", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/api_v1_production_log.json000066400000000000000000000005531464551303400317270ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 12:58:01 GMT", "content-type": "application/json", "content-length": "113", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/info000066400000000000000000000040101464551303400254140ustar00rootroot00000000000000 122309122530 800-00656-r06 D7.6.114 4c8675 0 1 false true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 3eb4d3 590-00019-r01 02.00.01 1f421b 500-00002-r01 07.06.114 43769e 500-00005-r01 01.02.425 4903b9 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 eaa252 500-00012-r01 02.02.00 c40e9c 500-00020-r01 22.11.03 ded018 500-00016-r01 02.00.00 54a6dc 500-00021-r01 01.00.00 19ae14 ec2-user-envoy_uber-pkg_master:pkg-Feb-03-23-05:45:21 1675403272 02.00.3704 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/info_log.json000066400000000000000000000006631464551303400272370ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 12:58:01 GMT", "content-type": "text/xml", "content-length": "2056", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/ivp_ensemble_dry_contacts000066400000000000000000000005131464551303400317110ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "open" }, { "id": "NC2", "status": "open" }, { "id": "NO1", "status": "open" }, { "id": "NO2", "status": "open" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/ivp_ensemble_dry_contacts_log.json000066400000000000000000000005031464551303400335210ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 12:58:02 GMT", "content-length": "330", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/ivp_ensemble_inventory000066400000000000000000000000031464551303400312440ustar00rootroot00000000000000[] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/ivp_ensemble_inventory_log.json000066400000000000000000000005011464551303400330600ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 12:58:02 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/ivp_ensemble_power000066400000000000000000000000271464551303400303510ustar00rootroot00000000000000{ "devices:": [] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/ivp_ensemble_power_log.json000066400000000000000000000005021464551303400321600ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 12:58:02 GMT", "content-length": "22", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/ivp_ss_dry_contact_settings000066400000000000000000000027271464551303400323120ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NC2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/ivp_ss_dry_contact_settings_log.json000066400000000000000000000005041464551303400341120ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 12:58:02 GMT", "content-length": "1494", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/production000066400000000000000000000006411464551303400266550ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 13, "readingTime": 1691413056, "wNow": 586, "whLifetime": 351236 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/production.json000066400000000000000000000005071464551303400276260ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 13, "readingTime": 1691413056, "wNow": 586, "whLifetime": 351236 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/production.json_log.json000066400000000000000000000007011464551303400314330ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 12:58:02 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.114_without_cts/production_log.json000066400000000000000000000007011464551303400304630ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 12:58:02 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175/000077500000000000000000000000001464551303400221165ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175/api_v1_production000066400000000000000000000001711464551303400254650ustar00rootroot00000000000000{ "wattHoursLifetime" : 8717473, "wattHoursSevenDays" : 107011, "wattHoursToday" : 7883, "wattsNow" : 3391 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175/api_v1_production_inverters000066400000000000000000000042131464551303400275670ustar00rootroot00000000000000[ { "devType" : 1, "lastReportDate" : 1691318583, "lastReportWatts" : 273, "maxReportWatts" : 297, "serialNumber" : "122146078718" }, { "devType" : 1, "lastReportDate" : 1691318584, "lastReportWatts" : 270, "maxReportWatts" : 296, "serialNumber" : "122146075749" }, { "devType" : 1, "lastReportDate" : 1691318612, "lastReportWatts" : 260, "maxReportWatts" : 297, "serialNumber" : "122146076488" }, { "devType" : 1, "lastReportDate" : 1691318643, "lastReportWatts" : 250, "maxReportWatts" : 297, "serialNumber" : "122146076618" }, { "devType" : 1, "lastReportDate" : 1691318462, "lastReportWatts" : 290, "maxReportWatts" : 297, "serialNumber" : "122146076518" }, { "devType" : 1, "lastReportDate" : 1691318523, "lastReportWatts" : 275, "maxReportWatts" : 296, "serialNumber" : "122146076336" }, { "devType" : 1, "lastReportDate" : 1691318704, "lastReportWatts" : 229, "maxReportWatts" : 297, "serialNumber" : "122146076125" }, { "devType" : 1, "lastReportDate" : 1691318672, "lastReportWatts" : 243, "maxReportWatts" : 297, "serialNumber" : "122146076272" }, { "devType" : 1, "lastReportDate" : 1691318556, "lastReportWatts" : 273, "maxReportWatts" : 297, "serialNumber" : "122146076492" }, { "devType" : 1, "lastReportDate" : 1691318613, "lastReportWatts" : 259, "maxReportWatts" : 297, "serialNumber" : "122146076500" }, { "devType" : 1, "lastReportDate" : 1691318494, "lastReportWatts" : 281, "maxReportWatts" : 297, "serialNumber" : "122146076029" }, { "devType" : 1, "lastReportDate" : 1691318673, "lastReportWatts" : 243, "maxReportWatts" : 297, "serialNumber" : "122146078769" }, { "devType" : 1, "lastReportDate" : 1691318674, "lastReportWatts" : 245, "maxReportWatts" : 297, "serialNumber" : "122146076128" } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175/info000066400000000000000000000040071464551303400227750ustar00rootroot00000000000000 121729017746 800-00555-r03 D7.6.175 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 3eb4d3 590-00018-r01 02.00.01 426697 500-00002-r01 07.03.130 91f206 500-00004-r01 01.02.413 9c64cd 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 f9ead3 500-00012-r01 02.02.00 848ead 500-00016-r01 02.00.00 54a6dc 500-00020-r01 22.10.09 983d9b 500-00021-r01 01.00.00 19ae14 ec2-user-envoy_uber-pkg_master:pkg-Jun-22-23-21:46:51 1687470523 02.00.4240 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175/ivp_ensemble_dry_contacts000066400000000000000000000005231464551303400272650ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "closed" }, { "id": "NC2", "status": "closed" }, { "id": "NO1", "status": "closed" }, { "id": "NO2", "status": "closed" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175/ivp_ensemble_inventory000066400000000000000000000000031464551303400266170ustar00rootroot00000000000000[] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175/ivp_ss_dry_contact_settings000066400000000000000000000027271464551303400276650ustar00rootroot00000000000000{ "dry_contacts": [ { "gen_action": "none", "grid_action": "none", "id": "NC1", "load_name": "", "micro_grid_action": "none", "mode": "manual", "override": "false", "pv_serial_nb": [], "soc_high": 70.0, "soc_low": 30.0, "type": "NONE" }, { "gen_action": "none", "grid_action": "none", "id": "NC2", "load_name": "", "micro_grid_action": "none", "mode": "manual", "override": "false", "pv_serial_nb": [], "soc_high": 70.0, "soc_low": 30.0, "type": "NONE" }, { "gen_action": "none", "grid_action": "none", "id": "NO1", "load_name": "", "micro_grid_action": "none", "mode": "manual", "override": "false", "pv_serial_nb": [], "soc_high": 70.0, "soc_low": 30.0, "type": "NONE" }, { "gen_action": "none", "grid_action": "none", "id": "NO2", "load_name": "", "micro_grid_action": "none", "mode": "manual", "override": "false", "pv_serial_nb": [], "soc_high": 70.0, "soc_low": 30.0, "type": "NONE" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175/production000066400000000000000000000006021464551303400242250ustar00rootroot00000000000000{ "production" : [ { "activeCount" : 13, "readingTime" : 1691318732, "type" : "inverters", "wNow" : 3413, "whLifetime" : 366148 } ], "storage" : [ { "activeCount" : 0, "readingTime" : 0, "state" : "idle", "type" : "acb", "wNow" : 0, "whNow" : 0 } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175/production.json000066400000000000000000000005101464551303400251730ustar00rootroot00000000000000{ "production": [ { "activeCount": 13, "readingTime": 1691318732, "type": "inverters", "wNow": 3413, "whLifetime": 366148 } ], "storage": [ { "activeCount": 0, "readingTime": 0, "state": "idle", "type": "acb", "wNow": 0, "whNow": 0 } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/000077500000000000000000000000001464551303400237765ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/api_v1_production000066400000000000000000000001621464551303400273450ustar00rootroot00000000000000{ "wattHoursToday": 36462, "wattHoursSevenDays": 189712, "wattHoursLifetime": 6139406, "wattsNow": 5740 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/api_v1_production_inverters000066400000000000000000000070531464551303400314540ustar00rootroot00000000000000[ { "serialNumber": "122219085275", "lastReportDate": 1691416241, "devType": 1, "lastReportWatts": 209, "maxReportWatts": 314 }, { "serialNumber": "122219085086", "lastReportDate": 1691416453, "devType": 1, "lastReportWatts": 248, "maxReportWatts": 339 }, { "serialNumber": "122219083015", "lastReportDate": 1691416509, "devType": 1, "lastReportWatts": 158, "maxReportWatts": 312 }, { "serialNumber": "122219082033", "lastReportDate": 1691416299, "devType": 1, "lastReportWatts": 211, "maxReportWatts": 324 }, { "serialNumber": "122220004338", "lastReportDate": 1691416271, "devType": 1, "lastReportWatts": 212, "maxReportWatts": 323 }, { "serialNumber": "122219084557", "lastReportDate": 1691416330, "devType": 1, "lastReportWatts": 219, "maxReportWatts": 312 }, { "serialNumber": "122220009431", "lastReportDate": 1691416210, "devType": 1, "lastReportWatts": 267, "maxReportWatts": 340 }, { "serialNumber": "122219085710", "lastReportDate": 1691416210, "devType": 1, "lastReportWatts": 207, "maxReportWatts": 327 }, { "serialNumber": "122218040027", "lastReportDate": 1691416390, "devType": 1, "lastReportWatts": 299, "maxReportWatts": 345 }, { "serialNumber": "122219083049", "lastReportDate": 1691416242, "devType": 1, "lastReportWatts": 214, "maxReportWatts": 315 }, { "serialNumber": "122219083804", "lastReportDate": 1691416420, "devType": 1, "lastReportWatts": 268, "maxReportWatts": 338 }, { "serialNumber": "122219086026", "lastReportDate": 1691416301, "devType": 1, "lastReportWatts": 222, "maxReportWatts": 319 }, { "serialNumber": "122219084937", "lastReportDate": 1691416359, "devType": 1, "lastReportWatts": 244, "maxReportWatts": 312 }, { "serialNumber": "122218043128", "lastReportDate": 1691416301, "devType": 1, "lastReportWatts": 292, "maxReportWatts": 354 }, { "serialNumber": "122218052484", "lastReportDate": 1691416275, "devType": 1, "lastReportWatts": 284, "maxReportWatts": 348 }, { "serialNumber": "122219085199", "lastReportDate": 1691416421, "devType": 1, "lastReportWatts": 213, "maxReportWatts": 326 }, { "serialNumber": "122218051640", "lastReportDate": 1691416484, "devType": 1, "lastReportWatts": 231, "maxReportWatts": 345 }, { "serialNumber": "122219084578", "lastReportDate": 1691416303, "devType": 1, "lastReportWatts": 275, "maxReportWatts": 338 }, { "serialNumber": "122219083053", "lastReportDate": 1691416331, "devType": 1, "lastReportWatts": 226, "maxReportWatts": 315 }, { "serialNumber": "122219084138", "lastReportDate": 1691416304, "devType": 1, "lastReportWatts": 211, "maxReportWatts": 307 }, { "serialNumber": "122218054157", "lastReportDate": 1691416304, "devType": 1, "lastReportWatts": 286, "maxReportWatts": 349 }, { "serialNumber": "122218042847", "lastReportDate": 1691416211, "devType": 1, "lastReportWatts": 272, "maxReportWatts": 341 }, { "serialNumber": "122220004813", "lastReportDate": 1691416212, "devType": 1, "lastReportWatts": 267, "maxReportWatts": 336 }, { "serialNumber": "122218044477", "lastReportDate": 1691416513, "devType": 1, "lastReportWatts": 205, "maxReportWatts": 346 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/api_v1_production_inverters_log.json000066400000000000000000000005541464551303400332640ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 13:55:33 GMT", "content-type": "application/json", "content-length": "3627", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/api_v1_production_log.json000066400000000000000000000005531464551303400311620ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 13:55:33 GMT", "content-type": "application/json", "content-length": "114", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/info000066400000000000000000000042001464551303400246500ustar00rootroot00000000000000 122302045041 800-00656-r06 D7.6.175 4c8675 0 1 false true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 3eb4d3 590-00019-r01 02.00.01 1f421b 500-00002-r01 07.06.175 f79c8d 500-00005-r01 01.02.371 373aab 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 eaa252 500-00012-r01 02.02.00 40061a 500-00020-r01 21.19.82 667fd7 500-00016-r01 02.00.00 54a6dc 500-00021-r01 01.00.00 19ae14 500-00001-r01 02.00.00 1210 ec2-user-envoy_uber-pkg_master:pkg-Jun-22-23-18:55:22 1687460237 02.00.4238 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/info_log.json000066400000000000000000000006631464551303400264720ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 13:55:33 GMT", "content-type": "text/xml", "content-length": "2176", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/ivp_ensemble_dry_contacts000066400000000000000000000005131464551303400311440ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "open" }, { "id": "NC2", "status": "open" }, { "id": "NO1", "status": "open" }, { "id": "NO2", "status": "open" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/ivp_ensemble_dry_contacts_log.json000066400000000000000000000005031464551303400327540ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 13:55:36 GMT", "content-length": "330", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/ivp_ensemble_inventory000066400000000000000000000000031464551303400304770ustar00rootroot00000000000000[] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/ivp_ensemble_inventory_log.json000066400000000000000000000005011464551303400323130ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 13:55:36 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/ivp_ensemble_power000066400000000000000000000000271464551303400276040ustar00rootroot00000000000000{ "devices:": [] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/ivp_ensemble_power_log.json000066400000000000000000000005021464551303400314130ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 13:55:36 GMT", "content-length": "22", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/ivp_ss_dry_contact_settings000066400000000000000000000027271464551303400315450ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NC2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/ivp_ss_dry_contact_settings_log.json000066400000000000000000000005041464551303400333450ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 13:55:36 GMT", "content-length": "1494", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/production000066400000000000000000000005101464551303400261030ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 24, "readingTime": 1691416513, "wNow": 5739, "whLifetime": 174174 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/production.json000066400000000000000000000005101464551303400270530ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 24, "readingTime": 1691416513, "wNow": 5739, "whLifetime": 174174 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/production.json_log.json000066400000000000000000000007011464551303400306660ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 13:55:35 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_standard/production_log.json000066400000000000000000000007011464551303400277160ustar00rootroot00000000000000{ "headers": { "server": "openresty/1.17.8.1", "date": "Mon, 07 Aug 2023 13:55:36 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff" }, "code": 200 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/000077500000000000000000000000001464551303400233215ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/admin_lib_tariff000066400000000000000000000034071464551303400265210ustar00rootroot00000000000000{"tariff":{"currency":{"code":"EUR"},"logger":"mylogger","date":"1688623885","storage_settings":{"mode":"self-consumption","operation_mode_sub_type":"","reserved_soc":30.0,"very_low_soc":10,"charge_from_grid":false,"date":"1688623885"},"single_rate":{"rate":0.38914,"sell":0.0},"seasons":[{"id":"all_year_long","start":"1/1","days":[{"id":"all_days","days":"Mon,Tue,Wed,Thu,Fri,Sat,Sun","must_charge_start":0,"must_charge_duration":0,"must_charge_mode":"CG","enable_discharge_to_grid":false,"periods":[{"id":"filler","start":0,"rate":0.38914},{"id":"period_1","start":420,"rate":0.4424},{"id":"filler","start":1381,"rate":0.38914}]}],"tiers":[]}],"seasons_sell":[]},"schedule":{"source":"Tariff","date":"2023-07-06 06:11:26 UTC","version":"00.00.02","reserved_soc":30.0,"operation_mode_sub_type":"","very_low_soc":10,"charge_from_grid":false,"battery_mode":"self-consumption","schedule":{"Disable":[{"Sun":[{"start":0,"duration":1440,"setting":"ID"}]},{"Mon":[{"start":0,"duration":1440,"setting":"ID"}]},{"Tue":[{"start":0,"duration":1440,"setting":"ID"}]},{"Wed":[{"start":0,"duration":1440,"setting":"ID"}]},{"Thu":[{"start":0,"duration":1440,"setting":"ID"}]},{"Fri":[{"start":0,"duration":1440,"setting":"ID"}]},{"Sat":[{"start":0,"duration":1440,"setting":"ID"}]}],"tariff":[{"start":"1/1","end":"1/1","Sun":[{"start":0,"duration":1440,"setting":"ZN"}],"Mon":[{"start":0,"duration":1440,"setting":"ZN"}],"Tue":[{"start":0,"duration":1440,"setting":"ZN"}],"Wed":[{"start":0,"duration":1440,"setting":"ZN"}],"Thu":[{"start":0,"duration":1440,"setting":"ZN"}],"Fri":[{"start":0,"duration":1440,"setting":"ZN"}],"Sat":[{"start":0,"duration":1440,"setting":"ZN"}]}]},"override":false,"override_backup_soc":30.0,"override_chg_dischg_rate":0.0,"override_tou_mode":"StorageTouMode_DEFAULT_TOU_MODE"}} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/admin_lib_tariff_log.json000066400000000000000000000006131464551303400303260ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:12:46 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/api_v1_production000066400000000000000000000001401464551303400266640ustar00rootroot00000000000000{ "wattHoursToday": 0, "wattHoursSevenDays": 0, "wattHoursLifetime": 0, "wattsNow": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/api_v1_production_inverters000066400000000000000000000040751464551303400310000ustar00rootroot00000000000000[ { "serialNumber": "122107031694", "lastReportDate": 1694182111, "devType": 1, "lastReportWatts": 193, "maxReportWatts": 289 }, { "serialNumber": "122107031731", "lastReportDate": 1694182200, "devType": 1, "lastReportWatts": 22, "maxReportWatts": 296 }, { "serialNumber": "122107033673", "lastReportDate": 1694182140, "devType": 1, "lastReportWatts": 21, "maxReportWatts": 296 }, { "serialNumber": "122107033629", "lastReportDate": 1694182081, "devType": 1, "lastReportWatts": 194, "maxReportWatts": 289 }, { "serialNumber": "122107035554", "lastReportDate": 1694182170, "devType": 1, "lastReportWatts": 21, "maxReportWatts": 296 }, { "serialNumber": "122107033602", "lastReportDate": 1694181992, "devType": 1, "lastReportWatts": 22, "maxReportWatts": 296 }, { "serialNumber": "122107035597", "lastReportDate": 1694182052, "devType": 1, "lastReportWatts": 21, "maxReportWatts": 296 }, { "serialNumber": "122107032623", "lastReportDate": 1694181960, "devType": 1, "lastReportWatts": 190, "maxReportWatts": 279 }, { "serialNumber": "122107035544", "lastReportDate": 1694182140, "devType": 1, "lastReportWatts": 191, "maxReportWatts": 283 }, { "serialNumber": "122107035551", "lastReportDate": 1694182111, "devType": 1, "lastReportWatts": 191, "maxReportWatts": 287 }, { "serialNumber": "122107032918", "lastReportDate": 1694181930, "devType": 1, "lastReportWatts": 21, "maxReportWatts": 296 }, { "serialNumber": "122107032940", "lastReportDate": 1694182172, "devType": 1, "lastReportWatts": 21, "maxReportWatts": 296 }, { "serialNumber": "122107025358", "lastReportDate": 1694181961, "devType": 1, "lastReportWatts": 190, "maxReportWatts": 279 }, { "serialNumber": "122107032484", "lastReportDate": 1694182142, "devType": 1, "lastReportWatts": 21, "maxReportWatts": 296 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/api_v1_production_inverters_log.json000066400000000000000000000005021464551303400326000ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:10:45 GMT", "content-type": "application/json", "content-length": "2109", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/api_v1_production_log.json000066400000000000000000000005001464551303400304750ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:10:45 GMT", "content-type": "application/json", "content-length": "96", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/info000066400000000000000000000036071464551303400242050ustar00rootroot00000000000000 122041077756 800-00654-r06 D7.6.175 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 3eb4d3 590-00019-r01 02.00.01 1f421b 500-00002-r01 07.06.175 f79c8d 500-00005-r01 01.02.346 b1b724 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 eaa252 500-00012-r01 02.02.00 40061a 500-00016-r01 02.00.00 54a6dc 500-00001-r01 02.00.00 1210 ec2-user-envoy_uber-pkg_master:pkg-Jun-22-23-18:55:22 1687460237 02.00.4238 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/info_log.json000066400000000000000000000005751464551303400260170ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:10:45 GMT", "content-type": "text/xml", "content-length": "1927", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ensemble_dry_contacts000066400000000000000000000005131464551303400304670ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "open" }, { "id": "NC2", "status": "open" }, { "id": "NO1", "status": "open" }, { "id": "NO2", "status": "open" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ensemble_dry_contacts_log.json000066400000000000000000000004351464551303400323030ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:11:47 GMT", "content-length": "330", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ensemble_generator000066400000000000000000000002771464551303400277700ustar00rootroot00000000000000{ "admin_state": "unknown", "oper_state": "open", "admin_mode": 0, "schedule": 0, "start_soc": 100, "stop_soc": -1, "exc_on": 0, "present": 1, "type": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ensemble_generator_log.json000066400000000000000000000004351464551303400315750ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:12:49 GMT", "content-length": "190", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ensemble_inventory000066400000000000000000000000031464551303400300220ustar00rootroot00000000000000[] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ensemble_inventory_log.json000066400000000000000000000004331464551303400316420ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:11:47 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ensemble_power000066400000000000000000000000271464551303400271270ustar00rootroot00000000000000{ "devices:": [] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ensemble_power_log.json000066400000000000000000000004341464551303400307420ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:11:47 GMT", "content-length": "22", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ensemble_secctrl000066400000000000000000000013321464551303400274320ustar00rootroot00000000000000{ "shutdown": false, "freq_bias_hz": 0.0, "voltage_bias_v": 0.0, "freq_bias_hz_q8": 0, "voltage_bias_v_q5": 0, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 30, "adjusted_backup_soc": 30, "agg_soc": 0, "Max_energy": 0, "ENC_agg_soc": 0, "ENC_agg_soh": 0, "ENC_agg_backup_energy": 0, "ENC_agg_avail_energy": 0, "Enc_commissioned_capacity": 0, "Enc_max_available_capacity": 0, "ACB_agg_soc": 0, "ACB_agg_energy": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ensemble_secctrl_log.json000066400000000000000000000004351464551303400312460ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:11:47 GMT", "content-length": "729", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ensemble_status000066400000000000000000000044771464551303400273330ustar00rootroot00000000000000{ "inventory": { "serial_nums": {} }, "counters": { "api_ecagtInit": 1, "api_ecagtTick": 8171232, "api_ecagtGetDeviceCount": 8188279, "api_ecagtGetDeviceInfo": 8171233, "api_ecagtSetSecCtrlBias": 739615, "api_ecagtGetSecCtrlBias": 50, "api_ecagtGetSecCtrlBiasQ": 50, "api_ecagtGetRelayState": 9805503, "api_ecagtSetDataModelCache": 1, "api_AggNameplate": 25, "api_ecagtGetGridFreq": 1634246, "api_ecagtGetGridVolt": 1634246, "api_ecagtGetGridFreq_err_notfound": 1634246, "rest_StatusGet": 26, "rest_InventoryGet": 51, "rest_SubmodGet": 14658, "rest_SecCtrlGet": 25, "rest_Power": 1, "ext_zb_send_msg": 5, "txmsg_OBJ_MDL_SECONDARY_CTRL_REQ": 5, "zmq_ecaHello": 1, "zmq_streamdata": 1634246, "zmq_ecaSecCtrlMsg": 739615, "zmq_meterlog_ok": 1, "dmdl_FILES_INDEXED": 3, "secctrlNotReady": 739610, "backupSocLimitSet": 739615, "backupSocLimitChanged": 1, "api_ecagtGetGenRelayState": 1634246 }, "secctrl": { "shutdown": false, "freq_bias_hz": 0.0, "voltage_bias_v": 0.0, "freq_bias_hz_q8": 0, "voltage_bias_v_q5": 0, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 30, "adjusted_backup_soc": 30, "agg_soc": 0, "Max_energy": 0, "ENC_agg_soc": 0, "ENC_agg_soh": 0, "ENC_agg_backup_energy": 0, "ENC_agg_avail_energy": 0, "Enc_commissioned_capacity": 0, "Enc_max_available_capacity": 0, "ACB_agg_soc": 0, "ACB_agg_energy": 0 }, "relay": { "mains_admin_state": "closed", "mains_oper_state": "closed", "der1_state": 0, "der2_state": 0, "Enchg_grid_mode": "unknown", "Solar_grid_mode": "unknown" }, "profile": { "message": "Obsolete API, please use ivp/arf/profile" }, "fakeit": { "fake_inventory_mode": false } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ensemble_status_log.json000066400000000000000000000004361464551303400311330ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:11:47 GMT", "content-length": "2366", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_meters000066400000000000000000000007141464551303400254230ustar00rootroot00000000000000[ { "eid": 704643328, "state": "disabled", "measurementType": "production", "phaseMode": "three", "phaseCount": 3, "meteringStatus": "normal", "statusFlags": [] }, { "eid": 704643584, "state": "disabled", "measurementType": "net-consumption", "phaseMode": "three", "phaseCount": 3, "meteringStatus": "normal", "statusFlags": [] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_meters_log.json000066400000000000000000000004351464551303400272340ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:12:49 GMT", "content-length": "459", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_meters_readings000066400000000000000000000111211464551303400272710ustar00rootroot00000000000000[ { "eid": 704643328, "timestamp": 1694182368, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.605, "activePower": 0.605, "apparentPower": 1.345, "reactivePower": 0.073, "pwrFactor": 0.188, "voltage": 236.068, "current": 0.519, "freq": 50.000, "channels": [ { "eid": 1778385169, "timestamp": 1694182368, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": -0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 230.966, "current": 0.000, "freq": 50.000 }, { "eid": 1778385170, "timestamp": 1694182368, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.167, "activePower": 0.167, "apparentPower": 0.251, "reactivePower": -0.000, "pwrFactor": 1.000, "voltage": 0.990, "current": 0.252, "freq": 50.000 }, { "eid": 1778385171, "timestamp": 1694182368, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.437, "activePower": 0.437, "apparentPower": 1.094, "reactivePower": 0.073, "pwrFactor": 0.000, "voltage": 4.112, "current": 0.266, "freq": 50.000 } ] }, { "eid": 704643584, "timestamp": 1694182368, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": -1.459, "activePower": -1.459, "apparentPower": 1.752, "reactivePower": 0.000, "pwrFactor": -1.000, "voltage": 239.518, "current": 0.248, "freq": 50.000, "channels": [ { "eid": 1778385425, "timestamp": 1694182368, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": -0.000, "reactivePower": -0.000, "pwrFactor": -1.000, "voltage": 230.993, "current": 0.000, "freq": 50.000 }, { "eid": 1778385426, "timestamp": 1694182368, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": -1.459, "activePower": -1.459, "apparentPower": 1.752, "reactivePower": 0.000, "pwrFactor": -1.000, "voltage": 7.076, "current": 0.248, "freq": 50.000 }, { "eid": 1778385427, "timestamp": 1694182368, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": -0.000, "activePower": -0.000, "apparentPower": 0.000, "reactivePower": -0.000, "pwrFactor": -1.000, "voltage": 1.449, "current": -0.000, "freq": 50.000 } ] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_meters_readings_log.json000066400000000000000000000004361464551303400311110ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:12:49 GMT", "content-length": "4688", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_sc_pvlimit000066400000000000000000000000611464551303400262700ustar00rootroot00000000000000{ "enable": false, "pv_limit_pct": 100 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_sc_pvlimit_log.json000066400000000000000000000004341464551303400301050ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:12:49 GMT", "content-length": "48", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ss_dry_contact_settings000066400000000000000000000027271464551303400310700ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NC2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ss_dry_contact_settings_log.json000066400000000000000000000004361464551303400326740ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:11:47 GMT", "content-length": "1494", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ss_gen_config000066400000000000000000000000031464551303400267160ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ss_gen_config_log.json000066400000000000000000000004331464551303400305360ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:12:49 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ss_gen_schedule000066400000000000000000000000031464551303400272450ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ss_gen_schedule_log.json000066400000000000000000000004331464551303400310650ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:12:49 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ss_pel_settings000066400000000000000000000000251464551303400273240ustar00rootroot00000000000000{ "PEL": false } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/ivp_ss_pel_settings_log.json000066400000000000000000000004341464551303400311410ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:12:49 GMT", "content-length": "20", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/production000066400000000000000000000024311464551303400254320ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":14,"readingTime":1694182292,"wNow":1317,"whLifetime":1152900},{"type":"eim","activeCount":0,"measurementType":"production","readingTime":1694182307,"wNow":0.71,"whLifetime":0.0,"varhLeadLifetime":0.0,"varhLagLifetime":0.0,"vahLifetime":0.0,"rmsCurrent":0.521,"rmsVoltage":236.127,"reactPwr":0.0,"apprntPwr":1.353,"pwrFactor":0.81,"whToday":0.0,"whLastSevenDays":0.0,"vahToday":0.0,"varhLeadToday":0.0,"varhLagToday":0.0}],"consumption":[{"type":"eim","activeCount":0,"measurementType":"total-consumption","readingTime":1694182307,"wNow":-0.749,"whLifetime":0.0,"varhLeadLifetime":0.0,"varhLagLifetime":0.0,"vahLifetime":0.0,"rmsCurrent":0.274,"rmsVoltage":239.62,"reactPwr":0.0,"apprntPwr":0.436,"pwrFactor":-1.0,"whToday":0.0,"whLastSevenDays":0.0,"vahToday":0.0,"varhLeadToday":0.0,"varhLagToday":0.0},{"type":"eim","activeCount":0,"measurementType":"net-consumption","readingTime":1694182307,"wNow":-1.459,"whLifetime":0.0,"varhLeadLifetime":0.0,"varhLagLifetime":0.0,"vahLifetime":0.0,"rmsCurrent":-0.247,"rmsVoltage":239.62,"reactPwr":0.0,"apprntPwr":-1.752,"pwrFactor":-1.0,"whToday":0,"whLastSevenDays":0,"vahToday":0,"varhLeadToday":0,"varhLagToday":0}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/production.json000066400000000000000000000024321464551303400264030ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":14,"readingTime":1694182262,"wNow":1322,"whLifetime":1152866},{"type":"eim","activeCount":0,"measurementType":"production","readingTime":1694182274,"wNow":0.641,"whLifetime":0.0,"varhLeadLifetime":0.0,"varhLagLifetime":0.0,"vahLifetime":0.0,"rmsCurrent":0.516,"rmsVoltage":235.291,"reactPwr":0.0,"apprntPwr":1.335,"pwrFactor":1.0,"whToday":0.0,"whLastSevenDays":0.0,"vahToday":0.0,"varhLeadToday":0.0,"varhLagToday":0.0}],"consumption":[{"type":"eim","activeCount":0,"measurementType":"total-consumption","readingTime":1694182274,"wNow":-0.768,"whLifetime":0.0,"varhLeadLifetime":0.0,"varhLagLifetime":0.0,"vahLifetime":0.0,"rmsCurrent":0.27,"rmsVoltage":238.786,"reactPwr":0.0,"apprntPwr":0.412,"pwrFactor":-1.0,"whToday":0.0,"whLastSevenDays":0.0,"vahToday":0.0,"varhLeadToday":0.0,"varhLagToday":0.0},{"type":"eim","activeCount":0,"measurementType":"net-consumption","readingTime":1694182274,"wNow":-1.409,"whLifetime":0.0,"varhLeadLifetime":0.0,"varhLagLifetime":0.0,"vahLifetime":0.0,"rmsCurrent":-0.247,"rmsVoltage":238.786,"reactPwr":0.0,"apprntPwr":-1.746,"pwrFactor":-1.0,"whToday":0,"whLastSevenDays":0,"vahToday":0,"varhLeadToday":0,"varhLagToday":0}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/production.json_log.json000066400000000000000000000006131464551303400302130ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:11:14 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_total/production_log.json000066400000000000000000000006131464551303400272430ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 08 Sep 2023 14:11:47 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/000077500000000000000000000000001464551303400240225ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/admin_lib_tariff000066400000000000000000000033221464551303400272160ustar00rootroot00000000000000{"tariff":{"currency":{"code":"EUR"},"logger":"mylogger","date":"1688053811","storage_settings":{"mode":"self-consumption","operation_mode_sub_type":"","reserved_soc":0.0,"very_low_soc":5,"charge_from_grid":false,"date":"1688053811"},"single_rate":{"rate":0.01,"sell":0.0},"seasons":[{"id":"all_year_long","start":"1/1","days":[{"id":"all_days","days":"Mon,Tue,Wed,Thu,Fri,Sat,Sun","must_charge_start":0,"must_charge_duration":0,"must_charge_mode":"CG","enable_discharge_to_grid":false,"periods":[{"id":"period_1","start":480,"rate":0.14},{"id":"filler","start":1320,"rate":0.01}]}],"tiers":[]}],"seasons_sell":[]},"schedule":{"source":"Tariff","date":"2023-06-29 15:50:12 UTC","version":"00.00.02","reserved_soc":0.0,"operation_mode_sub_type":"","very_low_soc":5,"charge_from_grid":false,"battery_mode":"self-consumption","schedule":{"Disable":[{"Sun":[{"start":0,"duration":1440,"setting":"ID"}]},{"Mon":[{"start":0,"duration":1440,"setting":"ID"}]},{"Tue":[{"start":0,"duration":1440,"setting":"ID"}]},{"Wed":[{"start":0,"duration":1440,"setting":"ID"}]},{"Thu":[{"start":0,"duration":1440,"setting":"ID"}]},{"Fri":[{"start":0,"duration":1440,"setting":"ID"}]},{"Sat":[{"start":0,"duration":1440,"setting":"ID"}]}],"tariff":[{"start":"1/1","end":"1/1","Sun":[{"start":0,"duration":1440,"setting":"ZN"}],"Mon":[{"start":0,"duration":1440,"setting":"ZN"}],"Tue":[{"start":0,"duration":1440,"setting":"ZN"}],"Wed":[{"start":0,"duration":1440,"setting":"ZN"}],"Thu":[{"start":0,"duration":1440,"setting":"ZN"}],"Fri":[{"start":0,"duration":1440,"setting":"ZN"}],"Sat":[{"start":0,"duration":1440,"setting":"ZN"}]}]},"override":false,"override_backup_soc":30.0,"override_chg_dischg_rate":0.0,"override_tou_mode":"StorageTouMode_DEFAULT_TOU_MODE"}} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/admin_lib_tariff_log.json000066400000000000000000000006131464551303400310270ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/api_v1_production000066400000000000000000000001601464551303400273670ustar00rootroot00000000000000{ "wattHoursToday": 4374, "wattHoursSevenDays": 111089, "wattHoursLifetime": 3183742, "wattsNow": 689 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/api_v1_production_inverters000066400000000000000000000020421464551303400314710ustar00rootroot00000000000000[ { "serialNumber": "121823030072", "lastReportDate": 1693745036, "devType": 1, "lastReportWatts": 58, "maxReportWatts": 253 }, { "serialNumber": "121823035149", "lastReportDate": 1693745066, "devType": 1, "lastReportWatts": 56, "maxReportWatts": 254 }, { "serialNumber": "482243031579", "lastReportDate": 1693744825, "devType": 1, "lastReportWatts": 135, "maxReportWatts": 365 }, { "serialNumber": "482243032888", "lastReportDate": 1693744828, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 365 }, { "serialNumber": "482250079070", "lastReportDate": 1693744828, "devType": 1, "lastReportWatts": 130, "maxReportWatts": 365 }, { "serialNumber": "482243033444", "lastReportDate": 1693744829, "devType": 1, "lastReportWatts": 127, "maxReportWatts": 365 }, { "serialNumber": "482243032889", "lastReportDate": 1693744946, "devType": 1, "lastReportWatts": 112, "maxReportWatts": 365 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/api_v1_production_inverters_log.json000066400000000000000000000005021464551303400333010ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:27 GMT", "content-type": "application/json", "content-length": "1058", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/api_v1_production_log.json000066400000000000000000000005011464551303400311770ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:27 GMT", "content-type": "application/json", "content-length": "112", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/info000066400000000000000000000041771464551303400247110ustar00rootroot00000000000000 122238082763 800-00654-r08 D7.6.175 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 3eb4d3 590-00019-r01 02.00.01 1f421b 500-00002-r01 07.06.175 f79c8d 500-00005-r01 01.02.371 373aab 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 eaa252 500-00012-r01 02.02.00 40061a 500-00020-r01 21.19.82 667fd7 500-00016-r01 02.00.00 54a6dc 500-00021-r01 01.00.00 19ae14 500-00001-r01 02.00.00 1210 ec2-user-envoy_uber-pkg_master:pkg-Jun-22-23-18:55:22 1687460237 02.00.4238 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/info_log.json000066400000000000000000000005751464551303400265200ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:27 GMT", "content-type": "text/xml", "content-length": "2175", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ensemble_dry_contacts000066400000000000000000000005131464551303400311700ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "open" }, { "id": "NC2", "status": "open" }, { "id": "NO1", "status": "open" }, { "id": "NO2", "status": "open" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ensemble_dry_contacts_log.json000066400000000000000000000004351464551303400330040ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "330", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ensemble_generator000066400000000000000000000002771464551303400304710ustar00rootroot00000000000000{ "admin_state": "unknown", "oper_state": "open", "admin_mode": 0, "schedule": 0, "start_soc": 100, "stop_soc": -1, "exc_on": 0, "present": 1, "type": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ensemble_generator_log.json000066400000000000000000000004351464551303400322760ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "190", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ensemble_inventory000066400000000000000000000000031464551303400305230ustar00rootroot00000000000000[] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ensemble_inventory_log.json000066400000000000000000000004331464551303400323430ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ensemble_power000066400000000000000000000000271464551303400276300ustar00rootroot00000000000000{ "devices:": [] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ensemble_power_log.json000066400000000000000000000004341464551303400314430ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "22", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ensemble_secctrl000066400000000000000000000013301464551303400301310ustar00rootroot00000000000000{ "shutdown": false, "freq_bias_hz": 0.0, "voltage_bias_v": 0.0, "freq_bias_hz_q8": 0, "voltage_bias_v_q5": 0, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 0, "adjusted_backup_soc": 0, "agg_soc": 0, "Max_energy": 0, "ENC_agg_soc": 0, "ENC_agg_soh": 0, "ENC_agg_backup_energy": 0, "ENC_agg_avail_energy": 0, "Enc_commissioned_capacity": 0, "Enc_max_available_capacity": 0, "ACB_agg_soc": 0, "ACB_agg_energy": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ensemble_secctrl_log.json000066400000000000000000000004351464551303400317470ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "727", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ensemble_status000066400000000000000000000045621464551303400300270ustar00rootroot00000000000000{ "inventory": { "serial_nums": {} }, "counters": { "api_ecagtInit": 1, "api_ecagtTick": 6254765, "api_ecagtGetDeviceCount": 6321456, "api_ecagtGetDeviceInfo": 6281617, "api_ecagtSetSecCtrlBias": 564094, "api_ecagtGetSecCtrlBias": 38, "api_ecagtGetSecCtrlBiasQ": 38, "api_ecagtGetRelayState": 7505737, "api_ecagtSetDataModelCache": 1, "api_AggNameplate": 19, "api_ecagtGetGridFreq": 1250953, "api_ecagtGetGridVolt": 1250953, "api_ecagtGetGridFreq_err_notfound": 1250953, "rest_StatusGet": 20, "rest_InventoryGet": 26915, "rest_SubmodGet": 11141, "rest_SecCtrlGet": 19, "rest_CommCheckGet": 26851, "rest_Power": 1, "ext_zb_send_msg": 564094, "txmsg_OBJ_MDL_SECONDARY_CTRL_REQ": 564094, "zmq_ecaHello": 1, "zmq_streamdata": 1250953, "zmq_eca_live_debug_req": 4, "zmq_ecaSecCtrlMsg": 564094, "zmq_meterlog_ok": 1, "dmdl_FILES_INDEXED": 3, "backupSocLimitSet": 564094, "backupSocLimitChanged": 2, "api_ecagtGetGenRelayState": 1250953 }, "secctrl": { "shutdown": false, "freq_bias_hz": 0.0, "voltage_bias_v": 0.0, "freq_bias_hz_q8": 0, "voltage_bias_v_q5": 0, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 0, "adjusted_backup_soc": 0, "agg_soc": 0, "Max_energy": 0, "ENC_agg_soc": 0, "ENC_agg_soh": 0, "ENC_agg_backup_energy": 0, "ENC_agg_avail_energy": 0, "Enc_commissioned_capacity": 0, "Enc_max_available_capacity": 0, "ACB_agg_soc": 0, "ACB_agg_energy": 0 }, "relay": { "mains_admin_state": "closed", "mains_oper_state": "closed", "der1_state": 0, "der2_state": 0, "Enchg_grid_mode": "grid-tied", "Solar_grid_mode": "unknown" }, "profile": { "message": "Obsolete API, please use ivp/arf/profile" }, "fakeit": { "fake_inventory_mode": false } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ensemble_status_log.json000066400000000000000000000004361464551303400316340ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "2417", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_meters000066400000000000000000000007121464551303400261220ustar00rootroot00000000000000[ { "eid": 704643328, "state": "enabled", "measurementType": "production", "phaseMode": "three", "phaseCount": 1, "meteringStatus": "normal", "statusFlags": [] }, { "eid": 704643584, "state": "enabled", "measurementType": "net-consumption", "phaseMode": "three", "phaseCount": 1, "meteringStatus": "normal", "statusFlags": [] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_meters_log.json000066400000000000000000000004351464551303400277350ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "457", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_meters_readings000066400000000000000000000113541464551303400300020ustar00rootroot00000000000000[ { "eid": 704643328, "timestamp": 1693745133, "actEnergyDlvd": 3183793.885, "actEnergyRcvd": 8851.704, "apparentEnergy": 3576167.385, "reactEnergyLagg": 591594.008, "reactEnergyLead": 0.021, "instantaneousDemand": 488.925, "activePower": 488.925, "apparentPower": 510.003, "reactivePower": 114.596, "pwrFactor": 0.957, "voltage": 235.236, "current": 2.169, "freq": 50.000, "channels": [ { "eid": 1778385169, "timestamp": 1693745133, "actEnergyDlvd": 3183793.885, "actEnergyRcvd": 8851.704, "apparentEnergy": 3576167.385, "reactEnergyLagg": 591594.008, "reactEnergyLead": 0.021, "instantaneousDemand": 488.925, "activePower": 488.925, "apparentPower": 510.003, "reactivePower": 114.596, "pwrFactor": 0.957, "voltage": 235.236, "current": 2.169, "freq": 50.000 }, { "eid": 1778385170, "timestamp": 1693745133, "actEnergyDlvd": 0.000, "actEnergyRcvd": 5370.790, "apparentEnergy": 295.364, "reactEnergyLagg": 387.143, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 6.124, "current": 0.000, "freq": 50.000 }, { "eid": 1778385171, "timestamp": 1693745133, "actEnergyDlvd": 0.022, "actEnergyRcvd": 9818.109, "apparentEnergy": 14032.684, "reactEnergyLagg": 391.775, "reactEnergyLead": 2.189, "instantaneousDemand": -1.044, "activePower": -1.044, "apparentPower": 2.602, "reactivePower": -0.000, "pwrFactor": -1.000, "voltage": 11.469, "current": 0.227, "freq": 50.000 } ] }, { "eid": 704643584, "timestamp": 1693745133, "actEnergyDlvd": 3738205.282, "actEnergyRcvd": 1776768.769, "apparentEnergy": 7252190.779, "reactEnergyLagg": 251.885, "reactEnergyLead": 3174027.145, "instantaneousDemand": -36.162, "activePower": -36.162, "apparentPower": 645.376, "reactivePower": -568.304, "pwrFactor": -0.060, "voltage": 235.201, "current": 2.745, "freq": 50.000, "channels": [ { "eid": 1778385425, "timestamp": 1693745133, "actEnergyDlvd": 3738205.282, "actEnergyRcvd": 1776768.769, "apparentEnergy": 7252190.779, "reactEnergyLagg": 251.885, "reactEnergyLead": 3174027.145, "instantaneousDemand": -36.162, "activePower": -36.162, "apparentPower": 645.376, "reactivePower": -568.304, "pwrFactor": -0.060, "voltage": 235.201, "current": 2.745, "freq": 50.000 }, { "eid": 1778385426, "timestamp": 1693745133, "actEnergyDlvd": 0.000, "actEnergyRcvd": 8279.267, "apparentEnergy": 141.429, "reactEnergyLagg": 378.426, "reactEnergyLead": 0.181, "instantaneousDemand": -0.000, "activePower": -0.000, "apparentPower": -0.000, "reactivePower": 0.000, "pwrFactor": -1.000, "voltage": 2.981, "current": 0.000, "freq": 50.000 }, { "eid": 1778385427, "timestamp": 1693745133, "actEnergyDlvd": 0.013, "actEnergyRcvd": 13980.174, "apparentEnergy": 6016.263, "reactEnergyLagg": 380.215, "reactEnergyLead": 1.245, "instantaneousDemand": -0.451, "activePower": -0.451, "apparentPower": 1.128, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 4.635, "current": 0.242, "freq": 50.000 } ] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_meters_readings_log.json000066400000000000000000000004361464551303400316120ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "4843", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_sc_pvlimit000066400000000000000000000000611464551303400267710ustar00rootroot00000000000000{ "enable": false, "pv_limit_pct": 100 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_sc_pvlimit_log.json000066400000000000000000000004341464551303400306060ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "48", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ss_dry_contact_settings000066400000000000000000000027271464551303400315710ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NC2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ss_dry_contact_settings_log.json000066400000000000000000000004361464551303400333750ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "1494", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ss_gen_config000066400000000000000000000000031464551303400274170ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ss_gen_config_log.json000066400000000000000000000004331464551303400312370ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ss_gen_schedule000066400000000000000000000000031464551303400277460ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ss_gen_schedule_log.json000066400000000000000000000004331464551303400315660ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ss_pel_settings000066400000000000000000000000251464551303400300250ustar00rootroot00000000000000{ "PEL": false } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/ivp_ss_pel_settings_log.json000066400000000000000000000004341464551303400316420ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "20", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/production000066400000000000000000000026541464551303400261420ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":7,"readingTime":1693745066,"wNow":751,"whLifetime":702919},{"type":"eim","activeCount":1,"measurementType":"production","readingTime":1693745131,"wNow":487.903,"whLifetime":3183793.452,"varhLeadLifetime":0.021,"varhLagLifetime":591593.906,"vahLifetime":3576166.933,"rmsCurrent":2.165,"rmsVoltage":235.525,"reactPwr":114.857,"apprntPwr":509.895,"pwrFactor":0.97,"whToday":4425.452,"whLastSevenDays":111093.452,"vahToday":5461.933,"varhLeadToday":0.021,"varhLagToday":1483.906}],"consumption":[{"type":"eim","activeCount":1,"measurementType":"total-consumption","readingTime":1693745131,"wNow":473.765,"whLifetime":5145153.764,"varhLeadLifetime":3174026.62,"varhLagLifetime":-591342.021,"vahLifetime":7252190.208,"rmsCurrent":-0.607,"rmsVoltage":235.49,"reactPwr":-457.841,"apprntPwr":-142.942,"pwrFactor":1.0,"whToday":19903.764,"whLastSevenDays":4.764,"vahToday":22904.208,"varhLeadToday":9602.62,"varhLagToday":0.0},{"type":"eim","activeCount":1,"measurementType":"net-consumption","readingTime":1693745131,"wNow":-14.138,"whLifetime":1961512.78,"varhLeadLifetime":3174026.64,"varhLagLifetime":251.885,"vahLifetime":7252190.208,"rmsCurrent":-2.772,"rmsVoltage":235.49,"reactPwr":-572.698,"apprntPwr":-652.719,"pwrFactor":-1.0,"whToday":0,"whLastSevenDays":0,"vahToday":0,"varhLeadToday":0,"varhLagToday":0}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/production.json000066400000000000000000000026621464551303400271110ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":7,"readingTime":1693745066,"wNow":751,"whLifetime":702919},{"type":"eim","activeCount":1,"measurementType":"production","readingTime":1693745129,"wNow":488.154,"whLifetime":3183793.303,"varhLeadLifetime":0.021,"varhLagLifetime":591593.872,"vahLifetime":3576166.777,"rmsCurrent":2.162,"rmsVoltage":235.777,"reactPwr":115.849,"apprntPwr":509.902,"pwrFactor":0.97,"whToday":4425.303,"whLastSevenDays":111093.303,"vahToday":5461.777,"varhLeadToday":0.021,"varhLagToday":1483.872}],"consumption":[{"type":"eim","activeCount":1,"measurementType":"total-consumption","readingTime":1693745129,"wNow":476.686,"whLifetime":5145153.621,"varhLeadLifetime":3174026.446,"varhLagLifetime":-591341.987,"vahLifetime":7252190.009,"rmsCurrent":-0.615,"rmsVoltage":235.743,"reactPwr":-456.848,"apprntPwr":-144.999,"pwrFactor":1.0,"whToday":19903.621,"whLastSevenDays":4.621,"vahToday":22904.009,"varhLeadToday":9602.446,"varhLagToday":0.0},{"type":"eim","activeCount":1,"measurementType":"net-consumption","readingTime":1693745129,"wNow":-11.468,"whLifetime":1961512.786,"varhLeadLifetime":3174026.466,"varhLagLifetime":251.885,"vahLifetime":7252190.009,"rmsCurrent":-2.778,"rmsVoltage":235.743,"reactPwr":-572.697,"apprntPwr":-654.785,"pwrFactor":-1.0,"whToday":0,"whLastSevenDays":0,"vahToday":0,"varhLeadToday":0,"varhLagToday":0}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/production.json_log.json000066400000000000000000000006131464551303400307140ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:29 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts/production_log.json000066400000000000000000000006131464551303400277440ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/000077500000000000000000000000001464551303400252655ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/_readme000066400000000000000000000015301464551303400266030ustar00rootroot000000000000007.6.175_with_cts_3phase UPDATE1: /production.json endpoint only provides phase details when passing parameter details=1 so /production file has phases removed while /production.json file has them included. ORIGINAL: Somewhere between fw 7.3.466 and 7.6.175 /production endpoint stopped reporting phase data for Envoy metered with CT and multi-phase (Split or Three). The original test fixture 7.6.175_with_cts_3phase includeded a /production endpoint file with phases included. To reflect actual firmware behavior the production and production.json files are updated to the pattern without phase details (lines:) as verified by ones from a diagnostics and debug log file for a 7.6.175 fw. Verified with 7.6.175 diagnostics: - admin_lib_tariff - api_v1_production_inverters - ivp_ensemble_inventory - ivp_meters - ivp_meters_readings - production pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/admin_lib_tariff000066400000000000000000000033221464551303400304610ustar00rootroot00000000000000{"tariff":{"currency":{"code":"EUR"},"logger":"mylogger","date":"1688053811","storage_settings":{"mode":"self-consumption","operation_mode_sub_type":"","reserved_soc":0.0,"very_low_soc":5,"charge_from_grid":false,"date":"1688053811"},"single_rate":{"rate":0.01,"sell":0.0},"seasons":[{"id":"all_year_long","start":"1/1","days":[{"id":"all_days","days":"Mon,Tue,Wed,Thu,Fri,Sat,Sun","must_charge_start":0,"must_charge_duration":0,"must_charge_mode":"CG","enable_discharge_to_grid":false,"periods":[{"id":"period_1","start":480,"rate":0.14},{"id":"filler","start":1320,"rate":0.01}]}],"tiers":[]}],"seasons_sell":[]},"schedule":{"source":"Tariff","date":"2023-06-29 15:50:12 UTC","version":"00.00.02","reserved_soc":0.0,"operation_mode_sub_type":"","very_low_soc":5,"charge_from_grid":false,"battery_mode":"self-consumption","schedule":{"Disable":[{"Sun":[{"start":0,"duration":1440,"setting":"ID"}]},{"Mon":[{"start":0,"duration":1440,"setting":"ID"}]},{"Tue":[{"start":0,"duration":1440,"setting":"ID"}]},{"Wed":[{"start":0,"duration":1440,"setting":"ID"}]},{"Thu":[{"start":0,"duration":1440,"setting":"ID"}]},{"Fri":[{"start":0,"duration":1440,"setting":"ID"}]},{"Sat":[{"start":0,"duration":1440,"setting":"ID"}]}],"tariff":[{"start":"1/1","end":"1/1","Sun":[{"start":0,"duration":1440,"setting":"ZN"}],"Mon":[{"start":0,"duration":1440,"setting":"ZN"}],"Tue":[{"start":0,"duration":1440,"setting":"ZN"}],"Wed":[{"start":0,"duration":1440,"setting":"ZN"}],"Thu":[{"start":0,"duration":1440,"setting":"ZN"}],"Fri":[{"start":0,"duration":1440,"setting":"ZN"}],"Sat":[{"start":0,"duration":1440,"setting":"ZN"}]}]},"override":false,"override_backup_soc":30.0,"override_chg_dischg_rate":0.0,"override_tou_mode":"StorageTouMode_DEFAULT_TOU_MODE"}} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/admin_lib_tariff_log.json000066400000000000000000000006131464551303400322720ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/api_v1_production000066400000000000000000000001601464551303400306320ustar00rootroot00000000000000{ "wattHoursToday": 4374, "wattHoursSevenDays": 111089, "wattHoursLifetime": 3183742, "wattsNow": 689 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/api_v1_production_inverters000066400000000000000000000020421464551303400327340ustar00rootroot00000000000000[ { "serialNumber": "121823030072", "lastReportDate": 1693745036, "devType": 1, "lastReportWatts": 58, "maxReportWatts": 253 }, { "serialNumber": "121823035149", "lastReportDate": 1693745066, "devType": 1, "lastReportWatts": 56, "maxReportWatts": 254 }, { "serialNumber": "482243031579", "lastReportDate": 1693744825, "devType": 1, "lastReportWatts": 135, "maxReportWatts": 365 }, { "serialNumber": "482243032888", "lastReportDate": 1693744828, "devType": 1, "lastReportWatts": 133, "maxReportWatts": 365 }, { "serialNumber": "482250079070", "lastReportDate": 1693744828, "devType": 1, "lastReportWatts": 130, "maxReportWatts": 365 }, { "serialNumber": "482243033444", "lastReportDate": 1693744829, "devType": 1, "lastReportWatts": 127, "maxReportWatts": 365 }, { "serialNumber": "482243032889", "lastReportDate": 1693744946, "devType": 1, "lastReportWatts": 112, "maxReportWatts": 365 } ] api_v1_production_inverters_log.json000066400000000000000000000005021464551303400344650ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:27 GMT", "content-type": "application/json", "content-length": "1058", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/api_v1_production_log.json000066400000000000000000000005011464551303400324420ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:27 GMT", "content-type": "application/json", "content-length": "112", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/info000066400000000000000000000041771464551303400261540ustar00rootroot00000000000000 122238082763 800-00654-r08 D7.6.175 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 3eb4d3 590-00019-r01 02.00.01 1f421b 500-00002-r01 07.06.175 f79c8d 500-00005-r01 01.02.371 373aab 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 eaa252 500-00012-r01 02.02.00 40061a 500-00020-r01 21.19.82 667fd7 500-00016-r01 02.00.00 54a6dc 500-00021-r01 01.00.00 19ae14 500-00001-r01 02.00.00 1210 ec2-user-envoy_uber-pkg_master:pkg-Jun-22-23-18:55:22 1687460237 02.00.4238 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/info_log.json000066400000000000000000000005751464551303400277630ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:27 GMT", "content-type": "text/xml", "content-length": "2175", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ensemble_dry_contacts000066400000000000000000000005131464551303400324330ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "open" }, { "id": "NC2", "status": "open" }, { "id": "NO1", "status": "open" }, { "id": "NO2", "status": "open" } ] } ivp_ensemble_dry_contacts_log.json000066400000000000000000000004351464551303400341700ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "330", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ensemble_generator000066400000000000000000000002771464551303400317340ustar00rootroot00000000000000{ "admin_state": "unknown", "oper_state": "open", "admin_mode": 0, "schedule": 0, "start_soc": 100, "stop_soc": -1, "exc_on": 0, "present": 1, "type": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ensemble_generator_log.json000066400000000000000000000004351464551303400335410ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "190", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ensemble_inventory000066400000000000000000000000031464551303400317660ustar00rootroot00000000000000[] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ensemble_inventory_log.json000066400000000000000000000004331464551303400336060ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ensemble_power000066400000000000000000000000271464551303400310730ustar00rootroot00000000000000{ "devices:": [] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ensemble_power_log.json000066400000000000000000000004341464551303400327060ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "22", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ensemble_secctrl000066400000000000000000000013301464551303400313740ustar00rootroot00000000000000{ "shutdown": false, "freq_bias_hz": 0.0, "voltage_bias_v": 0.0, "freq_bias_hz_q8": 0, "voltage_bias_v_q5": 0, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 0, "adjusted_backup_soc": 0, "agg_soc": 0, "Max_energy": 0, "ENC_agg_soc": 0, "ENC_agg_soh": 0, "ENC_agg_backup_energy": 0, "ENC_agg_avail_energy": 0, "Enc_commissioned_capacity": 0, "Enc_max_available_capacity": 0, "ACB_agg_soc": 0, "ACB_agg_energy": 0 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ensemble_secctrl_log.json000066400000000000000000000004351464551303400332120ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "727", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ensemble_status000066400000000000000000000045621464551303400312720ustar00rootroot00000000000000{ "inventory": { "serial_nums": {} }, "counters": { "api_ecagtInit": 1, "api_ecagtTick": 6254765, "api_ecagtGetDeviceCount": 6321456, "api_ecagtGetDeviceInfo": 6281617, "api_ecagtSetSecCtrlBias": 564094, "api_ecagtGetSecCtrlBias": 38, "api_ecagtGetSecCtrlBiasQ": 38, "api_ecagtGetRelayState": 7505737, "api_ecagtSetDataModelCache": 1, "api_AggNameplate": 19, "api_ecagtGetGridFreq": 1250953, "api_ecagtGetGridVolt": 1250953, "api_ecagtGetGridFreq_err_notfound": 1250953, "rest_StatusGet": 20, "rest_InventoryGet": 26915, "rest_SubmodGet": 11141, "rest_SecCtrlGet": 19, "rest_CommCheckGet": 26851, "rest_Power": 1, "ext_zb_send_msg": 564094, "txmsg_OBJ_MDL_SECONDARY_CTRL_REQ": 564094, "zmq_ecaHello": 1, "zmq_streamdata": 1250953, "zmq_eca_live_debug_req": 4, "zmq_ecaSecCtrlMsg": 564094, "zmq_meterlog_ok": 1, "dmdl_FILES_INDEXED": 3, "backupSocLimitSet": 564094, "backupSocLimitChanged": 2, "api_ecagtGetGenRelayState": 1250953 }, "secctrl": { "shutdown": false, "freq_bias_hz": 0.0, "voltage_bias_v": 0.0, "freq_bias_hz_q8": 0, "voltage_bias_v_q5": 0, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 0, "adjusted_backup_soc": 0, "agg_soc": 0, "Max_energy": 0, "ENC_agg_soc": 0, "ENC_agg_soh": 0, "ENC_agg_backup_energy": 0, "ENC_agg_avail_energy": 0, "Enc_commissioned_capacity": 0, "Enc_max_available_capacity": 0, "ACB_agg_soc": 0, "ACB_agg_energy": 0 }, "relay": { "mains_admin_state": "closed", "mains_oper_state": "closed", "der1_state": 0, "der2_state": 0, "Enchg_grid_mode": "grid-tied", "Solar_grid_mode": "unknown" }, "profile": { "message": "Obsolete API, please use ivp/arf/profile" }, "fakeit": { "fake_inventory_mode": false } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ensemble_status_log.json000066400000000000000000000004361464551303400330770ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "2417", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_meters000066400000000000000000000007121464551303400273650ustar00rootroot00000000000000[ { "eid": 704643328, "state": "enabled", "measurementType": "production", "phaseMode": "three", "phaseCount": 3, "meteringStatus": "normal", "statusFlags": [] }, { "eid": 704643584, "state": "enabled", "measurementType": "net-consumption", "phaseMode": "three", "phaseCount": 3, "meteringStatus": "normal", "statusFlags": [] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_meters_log.json000066400000000000000000000004351464551303400312000ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "457", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_meters_readings000066400000000000000000000113541464551303400312450ustar00rootroot00000000000000[ { "eid": 704643328, "timestamp": 1693745133, "actEnergyDlvd": 3183793.885, "actEnergyRcvd": 8851.704, "apparentEnergy": 3576167.385, "reactEnergyLagg": 591594.008, "reactEnergyLead": 0.021, "instantaneousDemand": 488.925, "activePower": 488.925, "apparentPower": 510.003, "reactivePower": 114.596, "pwrFactor": 0.957, "voltage": 235.236, "current": 2.169, "freq": 50.000, "channels": [ { "eid": 1778385169, "timestamp": 1693745133, "actEnergyDlvd": 3183793.885, "actEnergyRcvd": 8851.704, "apparentEnergy": 3576167.385, "reactEnergyLagg": 591594.008, "reactEnergyLead": 0.021, "instantaneousDemand": 488.925, "activePower": 488.925, "apparentPower": 510.003, "reactivePower": 114.596, "pwrFactor": 0.957, "voltage": 235.236, "current": 2.169, "freq": 50.000 }, { "eid": 1778385170, "timestamp": 1693745133, "actEnergyDlvd": 0.000, "actEnergyRcvd": 5370.790, "apparentEnergy": 295.364, "reactEnergyLagg": 387.143, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 6.124, "current": 0.000, "freq": 50.000 }, { "eid": 1778385171, "timestamp": 1693745133, "actEnergyDlvd": 0.022, "actEnergyRcvd": 9818.109, "apparentEnergy": 14032.684, "reactEnergyLagg": 391.775, "reactEnergyLead": 2.189, "instantaneousDemand": -1.044, "activePower": -1.044, "apparentPower": 2.602, "reactivePower": -0.000, "pwrFactor": -1.000, "voltage": 11.469, "current": 0.227, "freq": 50.000 } ] }, { "eid": 704643584, "timestamp": 1693745133, "actEnergyDlvd": 3738205.282, "actEnergyRcvd": 1776768.769, "apparentEnergy": 7252190.779, "reactEnergyLagg": 251.885, "reactEnergyLead": 3174027.145, "instantaneousDemand": -36.162, "activePower": -36.162, "apparentPower": 645.376, "reactivePower": -568.304, "pwrFactor": -0.060, "voltage": 235.201, "current": 2.745, "freq": 50.000, "channels": [ { "eid": 1778385425, "timestamp": 1693745133, "actEnergyDlvd": 3738205.282, "actEnergyRcvd": 1776768.769, "apparentEnergy": 7252190.779, "reactEnergyLagg": 251.885, "reactEnergyLead": 3174027.145, "instantaneousDemand": -36.162, "activePower": -36.162, "apparentPower": 645.376, "reactivePower": -568.304, "pwrFactor": -0.060, "voltage": 235.201, "current": 2.745, "freq": 50.000 }, { "eid": 1778385426, "timestamp": 1693745133, "actEnergyDlvd": 0.000, "actEnergyRcvd": 8279.267, "apparentEnergy": 141.429, "reactEnergyLagg": 378.426, "reactEnergyLead": 0.181, "instantaneousDemand": -0.000, "activePower": -0.000, "apparentPower": -0.000, "reactivePower": 0.000, "pwrFactor": -1.000, "voltage": 2.981, "current": 0.000, "freq": 50.000 }, { "eid": 1778385427, "timestamp": 1693745133, "actEnergyDlvd": 0.013, "actEnergyRcvd": 13980.174, "apparentEnergy": 6016.263, "reactEnergyLagg": 380.215, "reactEnergyLead": 1.245, "instantaneousDemand": -0.451, "activePower": -0.451, "apparentPower": 1.128, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 4.635, "current": 0.242, "freq": 50.000 } ] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_meters_readings_log.json000066400000000000000000000004361464551303400330550ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "4843", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_sc_pvlimit000066400000000000000000000000611464551303400302340ustar00rootroot00000000000000{ "enable": false, "pv_limit_pct": 100 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_sc_pvlimit_log.json000066400000000000000000000004341464551303400320510ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "48", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ss_dry_contact_settings000066400000000000000000000027271464551303400330340ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NC2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] } ] } ivp_ss_dry_contact_settings_log.json000066400000000000000000000004361464551303400345610ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-length": "1494", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ss_gen_config000066400000000000000000000000031464551303400306620ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ss_gen_config_log.json000066400000000000000000000004331464551303400325020ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ss_gen_schedule000066400000000000000000000000031464551303400312110ustar00rootroot00000000000000{} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ss_gen_schedule_log.json000066400000000000000000000004331464551303400330310ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ss_pel_settings000066400000000000000000000000251464551303400312700ustar00rootroot00000000000000{ "PEL": false } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/ivp_ss_pel_settings_log.json000066400000000000000000000004341464551303400331050ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:33 GMT", "content-length": "20", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/production000066400000000000000000000046571464551303400274120ustar00rootroot00000000000000{ "production": [{ "type": "inverters", "activeCount": 7, "readingTime": 0, "wNow": 0, "whLifetime": 4339764 }, { "type": "eim", "activeCount": 1, "measurementType": "production", "readingTime": 1693433002, "wNow": -6.481, "whLifetime": 4351113.2, "varhLeadLifetime": 0.005, "varhLagLifetime": 1264880.372, "vahLifetime": 5559527.987, "rmsCurrent": 0.658, "rmsVoltage": 712.588, "reactPwr": 84.546, "apprntPwr": 156.055, "pwrFactor": 0.0, "whToday": 5113.2, "whLastSevenDays": 69492.2, "vahToday": 8296.987, "varhLeadToday": 0.005, "varhLagToday": 2727.372 } ], "consumption": [{ "type": "eim", "activeCount": 1, "measurementType": "total-consumption", "readingTime": 1693433002, "wNow": 209.084, "whLifetime": 4074795.368, "varhLeadLifetime": 3936400.269, "varhLagLifetime": 1341552.434, "vahLifetime": 8735086.195, "rmsCurrent": 2.708, "rmsVoltage": 712.725, "reactPwr": -464.776, "apprntPwr": 1929.904, "pwrFactor": 0.11, "whToday": 12423.368, "whLastSevenDays": 68784.368, "vahToday": 18948.195, "varhLeadToday": 8224.269, "varhLagToday": 2802.434 }, { "type": "eim", "activeCount": 1, "measurementType": "net-consumption", "readingTime": 1693433002, "wNow": 215.565, "whLifetime": 2886562.459, "varhLeadLifetime": 3936400.264, "varhLagLifetime": 76672.062, "vahLifetime": 8735086.195, "rmsCurrent": 2.05, "rmsVoltage": 712.862, "reactPwr": -380.23, "apprntPwr": 487.922, "pwrFactor": 0.46, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ], "storage": [{ "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/production.json000066400000000000000000000205401464551303400303470ustar00rootroot00000000000000{ "production": [{ "type": "inverters", "activeCount": 7, "readingTime": 0, "wNow": 0, "whLifetime": 4339764 }, { "type": "eim", "activeCount": 1, "measurementType": "production", "readingTime": 1693433002, "wNow": -6.481, "whLifetime": 4351113.2, "varhLeadLifetime": 0.005, "varhLagLifetime": 1264880.372, "vahLifetime": 5559527.987, "rmsCurrent": 0.658, "rmsVoltage": 712.588, "reactPwr": 84.546, "apprntPwr": 156.055, "pwrFactor": 0.0, "whToday": 5113.2, "whLastSevenDays": 69492.2, "vahToday": 8296.987, "varhLeadToday": 0.005, "varhLagToday": 2727.372, "lines": [{ "wNow": -2.864, "whLifetime": 1869678.394, "varhLeadLifetime": 0.002, "varhLagLifetime": 539695.061, "vahLifetime": 2377390.886, "rmsCurrent": 0.286, "rmsVoltage": 236.766, "reactPwr": 50.856, "apprntPwr": 67.699, "pwrFactor": 0.0, "whToday": 2200.394, "whLastSevenDays": 29891.394, "vahToday": 3576.886, "varhLeadToday": 0.002, "varhLagToday": 1163.061 }, { "wNow": 0.0, "whLifetime": 1241245.645, "varhLeadLifetime": 0.001, "varhLagLifetime": 366839.383, "vahLifetime": 1241038.844, "rmsCurrent": -0.0, "rmsVoltage": 237.918, "reactPwr": 0.0, "apprntPwr": -0.0, "pwrFactor": 0.0, "whToday": 1454.645, "whLastSevenDays": 19793.645, "vahToday": 1528.844, "varhLeadToday": 0.001, "varhLagToday": 792.383 }, { "wNow": -3.617, "whLifetime": 1240189.161, "varhLeadLifetime": 0.002, "varhLagLifetime": 358345.928, "vahLifetime": 1941098.256, "rmsCurrent": 0.372, "rmsVoltage": 237.904, "reactPwr": 33.69, "apprntPwr": 88.355, "pwrFactor": 0.0, "whToday": 1458.161, "whLastSevenDays": 19807.161, "vahToday": 3191.256, "varhLeadToday": 0.002, "varhLagToday": 771.928 } ] } ], "consumption": [{ "type": "eim", "activeCount": 1, "measurementType": "total-consumption", "readingTime": 1693433002, "wNow": 209.084, "whLifetime": 4074795.368, "varhLeadLifetime": 3936400.269, "varhLagLifetime": 1341552.434, "vahLifetime": 8735086.195, "rmsCurrent": 2.708, "rmsVoltage": 712.725, "reactPwr": -464.776, "apprntPwr": 1929.904, "pwrFactor": 0.11, "whToday": 12423.368, "whLastSevenDays": 68784.368, "vahToday": 18948.195, "varhLeadToday": 8224.269, "varhLagToday": 2802.434, "lines": [{ "wNow": 88.573, "whLifetime": 2293782.928, "varhLeadLifetime": 2114284.979, "varhLagLifetime": 578414.935, "vahLifetime": 4268391.905, "rmsCurrent": 1.295, "rmsVoltage": 236.836, "reactPwr": -257.565, "apprntPwr": 306.73, "pwrFactor": 0.29, "whToday": 8584.928, "whLastSevenDays": 39391.928, "vahToday": 10866.905, "varhLeadToday": 4108.979, "varhLagToday": 1188.935 }, { "wNow": 123.364, "whLifetime": 948057.969, "varhLeadLifetime": 1059082.625, "varhLagLifetime": 383807.966, "vahLifetime": 2331874.944, "rmsCurrent": 0.861, "rmsVoltage": 237.934, "reactPwr": -132.184, "apprntPwr": 204.919, "pwrFactor": 0.6, "whToday": 2154.969, "whLastSevenDays": 18948.969, "vahToday": 4293.944, "varhLeadToday": 2783.625, "varhLagToday": 815.966 }, { "wNow": -2.853, "whLifetime": 832954.471, "varhLeadLifetime": 763032.665, "varhLagLifetime": 379329.532, "vahLifetime": 2134819.346, "rmsCurrent": 0.551, "rmsVoltage": 237.956, "reactPwr": -75.026, "apprntPwr": 131.213, "pwrFactor": -0.02, "whToday": 1683.471, "whLastSevenDays": 10443.471, "vahToday": 3787.346, "varhLeadToday": 1331.665, "varhLagToday": 797.532 } ] }, { "type": "eim", "activeCount": 1, "measurementType": "net-consumption", "readingTime": 1693433002, "wNow": 215.565, "whLifetime": 2886562.459, "varhLeadLifetime": 3936400.264, "varhLagLifetime": 76672.062, "vahLifetime": 8735086.195, "rmsCurrent": 2.05, "rmsVoltage": 712.862, "reactPwr": -380.23, "apprntPwr": 487.922, "pwrFactor": 0.46, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0, "lines": [{ "wNow": 91.437, "whLifetime": 1625201.414, "varhLeadLifetime": 2114284.977, "varhLagLifetime": 38719.874, "vahLifetime": 4268391.905, "rmsCurrent": 1.009, "rmsVoltage": 236.905, "reactPwr": -206.71, "apprntPwr": 238.691, "pwrFactor": 0.41, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 }, { "wNow": 123.364, "whLifetime": 629892.171, "varhLeadLifetime": 1059082.624, "varhLagLifetime": 16968.583, "vahLifetime": 2331874.944, "rmsCurrent": 0.861, "rmsVoltage": 237.949, "reactPwr": -132.184, "apprntPwr": 206.35, "pwrFactor": 0.61, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 }, { "wNow": 0.764, "whLifetime": 631468.875, "varhLeadLifetime": 763032.663, "varhLagLifetime": 20983.605, "vahLifetime": 2134819.346, "rmsCurrent": 0.179, "rmsVoltage": 238.007, "reactPwr": -41.336, "apprntPwr": 42.881, "pwrFactor": 0.0, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ] } ], "storage": [{ "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/production.json_log.json000066400000000000000000000006131464551303400321570ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:29 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.175_with_cts_3phase/production_log.json000066400000000000000000000006131464551303400312070ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Sun, 03 Sep 2023 12:45:31 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/000077500000000000000000000000001464551303400270055ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/admin_lib_tariff000066400000000000000000000044541464551303400322100ustar00rootroot00000000000000{"tariff":{"currency":{"code":"EUR"},"logger":"mylogger","date":"1695744220","storage_settings":{"mode":"self-consumption","operation_mode_sub_type":"","reserved_soc":15.0,"very_low_soc":5,"charge_from_grid":true,"date":"1695598084"},"single_rate":{"rate":0.0,"sell":0.0},"seasons":[{"id":"season_1","start":"1/1","days":[{"id":"all_days","days":"Mon,Tue,Wed,Thu,Fri,Sat,Sun","must_charge_start":444,"must_charge_duration":35,"must_charge_mode":"CG","enable_discharge_to_grid":true,"periods":[{"id":"period_1","start":480,"rate":0.1898},{"id":"filler","start":1320,"rate":0.1034}]}],"tiers":[]}],"seasons_sell":[]},"schedule":{"source":"Tariff","date":"2023-09-26 16:03:40 UTC","version":"00.00.02","reserved_soc":15.0,"operation_mode_sub_type":"","very_low_soc":5,"charge_from_grid":true,"battery_mode":"self-consumption","schedule":{"Disable":[{"Sun":[{"start":0,"duration":1440,"setting":"ID"}]},{"Mon":[{"start":0,"duration":1440,"setting":"ID"}]},{"Tue":[{"start":0,"duration":1440,"setting":"ID"}]},{"Wed":[{"start":0,"duration":1440,"setting":"ID"}]},{"Thu":[{"start":0,"duration":1440,"setting":"ID"}]},{"Fri":[{"start":0,"duration":1440,"setting":"ID"}]},{"Sat":[{"start":0,"duration":1440,"setting":"ID"}]}],"tariff":[{"start":"1/1","end":"1/1","Sun":[{"start":0,"duration":444,"setting":"ZN"},{"start":444,"duration":35,"setting":"CG"},{"start":479,"duration":961,"setting":"ZN"}],"Mon":[{"start":0,"duration":444,"setting":"ZN"},{"start":444,"duration":35,"setting":"CG"},{"start":479,"duration":961,"setting":"ZN"}],"Tue":[{"start":0,"duration":444,"setting":"ZN"},{"start":444,"duration":35,"setting":"CG"},{"start":479,"duration":961,"setting":"ZN"}],"Wed":[{"start":0,"duration":444,"setting":"ZN"},{"start":444,"duration":35,"setting":"CG"},{"start":479,"duration":961,"setting":"ZN"}],"Thu":[{"start":0,"duration":444,"setting":"ZN"},{"start":444,"duration":35,"setting":"CG"},{"start":479,"duration":961,"setting":"ZN"}],"Fri":[{"start":0,"duration":444,"setting":"ZN"},{"start":444,"duration":35,"setting":"CG"},{"start":479,"duration":961,"setting":"ZN"}],"Sat":[{"start":0,"duration":444,"setting":"ZN"},{"start":444,"duration":35,"setting":"CG"},{"start":479,"duration":961,"setting":"ZN"}]}]},"override":false,"override_backup_soc":30.0,"override_chg_dischg_rate":0.0,"override_tou_mode":"StorageTouMode_DEFAULT_TOU_MODE"}} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/admin_lib_tariff_log.json000066400000000000000000000006131464551303400340120ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:11 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/api_v1_production000066400000000000000000000001521464551303400323530ustar00rootroot00000000000000{ "wattHoursToday": 0, "wattHoursSevenDays": 73002, "wattHoursLifetime": 2432969, "wattsNow": 0 } api_v1_production_inverters000066400000000000000000000013541464551303400344020ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t[ { "serialNumber": "482243033113", "lastReportDate": 1695752919, "devType": 1, "lastReportWatts": 0, "maxReportWatts": 361 }, { "serialNumber": "482246043645", "lastReportDate": 1695752947, "devType": 1, "lastReportWatts": 0, "maxReportWatts": 361 }, { "serialNumber": "482246047675", "lastReportDate": 1695752865, "devType": 1, "lastReportWatts": 0, "maxReportWatts": 361 }, { "serialNumber": "482246047880", "lastReportDate": 1695752936, "devType": 1, "lastReportWatts": 0, "maxReportWatts": 360 }, { "serialNumber": "482243033093", "lastReportDate": 1695752940, "devType": 1, "lastReportWatts": 0, "maxReportWatts": 362 } ] api_v1_production_inverters_log.json000066400000000000000000000005011464551303400362040ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:08 GMT", "content-type": "application/json", "content-length": "748", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} api_v1_production_log.json000066400000000000000000000005011464551303400341030ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:08 GMT", "content-type": "application/json", "content-length": "106", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/info000066400000000000000000000040071464551303400276640ustar00rootroot00000000000000 122238082690 800-00654-r08 D7.6.185 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 3eb4d3 590-00019-r01 02.00.01 1f421b 500-00002-r01 07.06.185 97768a 500-00005-r01 01.02.439 a930df 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 eaa252 500-00012-r01 02.02.00 f41c50 500-00020-r01 22.11.46 5ffaa1 500-00016-r01 02.00.00 54a6dc 500-00021-r01 01.00.00 19ae14 ec2-user-envoy_uber-pkg_master:pkg-Jun-22-23-18:55:22 1687460237 02.00.4238 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/info_log.json000066400000000000000000000005751464551303400315030ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:08 GMT", "content-type": "text/xml", "content-length": "2055", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_ensemble_dry_contacts000066400000000000000000000005131464551303400341530ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "open" }, { "id": "NC2", "status": "open" }, { "id": "NO1", "status": "open" }, { "id": "NO2", "status": "open" } ] } ivp_ensemble_dry_contacts_log.json000066400000000000000000000004351464551303400357100ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-length": "330", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_ensemble_generator000066400000000000000000000002771464551303400334540ustar00rootroot00000000000000{ "admin_state": "unknown", "oper_state": "open", "admin_mode": 0, "schedule": 0, "start_soc": 100, "stop_soc": -1, "exc_on": 0, "present": 1, "type": 0 } ivp_ensemble_generator_log.json000066400000000000000000000004351464551303400352020ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "190", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_ensemble_inventory000066400000000000000000000022461464551303400335210ustar00rootroot00000000000000[ { "type": "ENCHARGE", "devices": [ { "part_num": "830-01760-r37", "installed": 1695330323, "serial_num": "122249097612", "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1695769447, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1695330323, "img_load_date": 1695330323, "img_pnum_running": "2.6.5973_rel/22.11", "zigbee_dongle_fw_version": "100F", "bmu_fw_version": "2.1.34", "operating": true, "communicating": true, "sleep_enabled": false, "percentFull": 15, "temperature": 29, "maxCellTemp": 30, "comm_level_sub_ghz": 4, "comm_level_2_4_ghz": 4, "led_status": 17, "dc_switch_off": false, "encharge_rev": 2, "encharge_capacity": 3500 } ] } ] ivp_ensemble_inventory_log.json000066400000000000000000000004361464551303400352520ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-length": "1189", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_ensemble_power000066400000000000000000000002651464551303400326170ustar00rootroot00000000000000{ "devices:": [ { "serial_num": "122249097612", "real_power_mw": 0, "apparent_power_mva": 0, "soc": 15 } ] } ivp_ensemble_power_log.json000066400000000000000000000004351464551303400343500ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-length": "180", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_ensemble_secctrl000066400000000000000000000014161464551303400331210ustar00rootroot00000000000000{ "shutdown": false, "freq_bias_hz": 1.3899999856948853, "voltage_bias_v": 16.899999618530275, "freq_bias_hz_q8": 2235, "voltage_bias_v_q5": 540, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 15, "adjusted_backup_soc": 15, "agg_soc": 15, "Max_energy": 3500, "ENC_agg_soc": 15, "ENC_agg_soh": 100, "ENC_agg_backup_energy": 525, "ENC_agg_avail_energy": 525, "Enc_commissioned_capacity": 3500, "Enc_max_available_capacity": 3500, "ACB_agg_soc": 0, "ACB_agg_energy": 0 } ivp_ensemble_secctrl_log.json000066400000000000000000000004351464551303400346530ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-length": "781", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_ensemble_status000066400000000000000000000212501464551303400330030ustar00rootroot00000000000000{ "inventory": { "serial_nums": { "122249097612": { "device_type": 13, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "grid-tied", "phase": 1, "encharge_revision": 2, "encharge_capacity": 3500, "encharge_rated_power": 1280, "msg_retry_count": 1, "part_number": "830-01760-r37", "assembly_number": "890-00023-r39", "app_fw_version": "2.6.5973_rel/22.11", "zb_fw_version": "100F", "zb_bootloader_vers": "1.B.5", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "2.1.34", "submodule_count": 6, "submodules": { "122248094067": { "device_type": 16, "admin_state": 1, "part_number": "620-00291-r02", "assembly_number": "800-00291-r02", "dmir": { "part_number": "", "assembly_number": "" }, "procload": { "part_number": "490-00154", "assembly_number": "2.1.34" } }, "122249004224": { "device_type": 14, "admin_state": 1, "part_number": "800-01335-r01", "assembly_number": "880-01335-r10", "dmir": { "part_number": "549-00030-r00", "assembly_number": "3.28.2-D48" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.28.2-D48" } }, "122249016424": { "device_type": 14, "admin_state": 1, "part_number": "800-01335-r01", "assembly_number": "880-01335-r10", "dmir": { "part_number": "549-00030-r00", "assembly_number": "3.28.2-D48" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.28.2-D48" } }, "122249017193": { "device_type": 14, "admin_state": 1, "part_number": "800-01335-r01", "assembly_number": "880-01335-r10", "dmir": { "part_number": "549-00030-r00", "assembly_number": "3.28.2-D48" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.28.2-D48" } }, "122249017363": { "device_type": 14, "admin_state": 1, "part_number": "800-01335-r01", "assembly_number": "880-01335-r10", "dmir": { "part_number": "549-00030-r00", "assembly_number": "3.28.2-D48" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.28.2-D48" } }, "122249045297": { "device_type": 15, "admin_state": 1, "part_number": "800-01854-r06", "assembly_number": "800-01854-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "2.6.5973_rel/22.11" } } } } } }, "counters": { "api_ecagtInit": 1, "api_ecagtTick": 4271944, "api_ecagtDeviceInsert": 4, "api_ecagtDeviceNetworkStatus": 57950, "api_ecagtDeviceCommissionStatus": 25, "api_ecagtDeviceRemoved": 2, "api_ecagtGetDeviceCount": 4325203, "api_ecagtGetDeviceInfo": 4323962, "api_ecagtGetOneDeviceInfo": 14, "api_ecagtDevIdToSerial": 82006, "api_ecagtHandleMsg": 80765, "api_ecagtGetSubmoduleInv": 8929, "api_ecagtGetDataModelRaw": 23255, "api_ecagtSetSecCtrlBias": 387023, "api_ecagtGetSecCtrlBias": 26704, "api_ecagtGetSecCtrlBiasQ": 23498, "api_ecagtGetRelayState": 5127595, "api_ecagtSetDataModelCache": 1, "api_AggNameplate": 14, "api_ecagtGetGridFreq": 854388, "api_ecagtGetGridVolt": 854388, "api_ecagtGetGridFreq_err_notfound": 854388, "rest_StatusGet": 18, "rest_SleepGet": 1, "rest_InventoryGet": 19843, "rest_SubmodGet": 7670, "rest_SecCtrlGet": 23481, "rest_RelayGet": 6, "rest_RelayPost": 1, "rest_CommCheckGet": 599, "rest_Power": 19252, "ext_zb_send_msg": 397049, "ext_cfg_save_device": 4, "ext_cfg_save_device_err": 4, "ext_send_perf_data": 77997, "ext_event_set_stateful": 7087, "ext_event_set_modgone": 28, "rxmsg_OBJ_MDL_META_RSP": 4, "rxmsg_OBJ_MDL_INV_UPD_RSP": 305, "rxmsg_OBJ_MDL_POLL_RSP": 77997, "rxmsg_OBJ_MDL_GRID_STATUS_RSP": 8, "rxmsg_OBJ_MDL_EVENTS_MSG": 2387, "rxmsg_OBJ_MDL_SOC_CONFIG_RSP": 14, "txmsg_OBJ_MDL_META_REQ": 8, "txmsg_OBJ_MDL_ENC_RT_POLL_REQ": 17, "txmsg_OBJ_MDL_BMU_POLL_REQ": 3553, "txmsg_OBJ_MDL_PCU_POLL_REQ": 3553, "txmsg_OBJ_MDL_SECONDARY_CTRL_REQ": 387023, "txmsg_OBJ_MDL_GRID_STATUS_REQ": 8, "txmsg_OBJ_MDL_EVENTS_ACK": 2387, "txmsg_OBJ_MDL_SOC_CONFIG_REQ": 14, "txmsg_OBJ_MDL_TNS_START": 16, "rxmsg_OBJ_MDL_TNS_START_RSP": 16, "txmsg_OBJ_MDL_SET_UDMIR": 19, "rxmsg_OBJ_MDL_SET_UDMIR_RSP": 18, "txmsg_OBJ_MDL_TNS_END": 16, "rxmsg_OBJ_MDL_TNS_END_RSP": 16, "txmsg_lvs_poll": 435, "zmq_ecaHello": 1, "zmq_ecaDevInfo": 33, "zmq_ecaNetworkStatus": 57950, "zmq_ecaAppMsg": 80765, "zmq_streamdata": 854388, "zmq_live_debug": 3206, "zmq_eca_live_debug_req": 160, "zmq_nameplate": 138, "zmq_ecaSecCtrlMsg": 387023, "zmq_meterlog_ok": 1, "dmdl_FILES_INDEXED": 3, "devPollMissing": 12056, "gridProfileTransaction": 32, "fsm_retry_timeout": 8, "profile_txn_ack": 16, "backupSocLimitSet": 388486, "backupSocLimitChanged": 8, "api_ecagtGetGenRelayState": 854390 }, "secctrl": { "shutdown": false, "freq_bias_hz": 1.3899999856948853, "voltage_bias_v": 16.899999618530275, "freq_bias_hz_q8": 2235, "voltage_bias_v_q5": 540, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 15, "adjusted_backup_soc": 15, "agg_soc": 15, "Max_energy": 3500, "ENC_agg_soc": 15, "ENC_agg_soh": 100, "ENC_agg_backup_energy": 525, "ENC_agg_avail_energy": 525, "Enc_commissioned_capacity": 3500, "Enc_max_available_capacity": 3500, "ACB_agg_soc": 0, "ACB_agg_energy": 0 }, "relay": { "mains_admin_state": "closed", "mains_oper_state": "closed", "der1_state": 0, "der2_state": 0, "Enchg_grid_mode": "grid-tied", "Solar_grid_mode": "unknown" }, "profile": { "message": "Obsolete API, please use ivp/arf/profile" }, "fakeit": { "fake_inventory_mode": false } } ivp_ensemble_status_log.json000066400000000000000000000004361464551303400345400ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-length": "8871", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_meters000066400000000000000000000007121464551303400311050ustar00rootroot00000000000000[ { "eid": 704643328, "state": "enabled", "measurementType": "production", "phaseMode": "three", "phaseCount": 1, "meteringStatus": "normal", "statusFlags": [] }, { "eid": 704643584, "state": "enabled", "measurementType": "net-consumption", "phaseMode": "three", "phaseCount": 1, "meteringStatus": "normal", "statusFlags": [] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_meters_log.json000066400000000000000000000004351464551303400327200ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "457", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_meters_readings000066400000000000000000000113441464551303400327640ustar00rootroot00000000000000[ { "eid": 704643328, "timestamp": 1695769632, "actEnergyDlvd": 2432969.956, "actEnergyRcvd": 1795.013, "apparentEnergy": 2709025.378, "reactEnergyLagg": 392075.354, "reactEnergyLead": 7.266, "instantaneousDemand": -0.661, "activePower": -0.661, "apparentPower": 92.126, "reactivePower": 82.942, "pwrFactor": 0.000, "voltage": 238.524, "current": 0.386, "freq": 50.000, "channels": [ { "eid": 1778385169, "timestamp": 1695769632, "actEnergyDlvd": 2432969.956, "actEnergyRcvd": 1795.013, "apparentEnergy": 2709025.378, "reactEnergyLagg": 392075.354, "reactEnergyLead": 7.266, "instantaneousDemand": -0.661, "activePower": -0.661, "apparentPower": 92.126, "reactivePower": 82.942, "pwrFactor": 0.000, "voltage": 238.524, "current": 0.386, "freq": 50.000 }, { "eid": 1778385170, "timestamp": 1695769632, "actEnergyDlvd": 0.013, "actEnergyRcvd": 8248.228, "apparentEnergy": 140.353, "reactEnergyLagg": 355.453, "reactEnergyLead": 1.715, "instantaneousDemand": -0.000, "activePower": -0.000, "apparentPower": -0.000, "reactivePower": -0.000, "pwrFactor": 0.000, "voltage": 7.648, "current": -0.000, "freq": 50.000 }, { "eid": 1778385171, "timestamp": 1695769632, "actEnergyDlvd": 0.000, "actEnergyRcvd": 12408.486, "apparentEnergy": 898.304, "reactEnergyLagg": 419.396, "reactEnergyLead": 0.000, "instantaneousDemand": -0.077, "activePower": -0.077, "apparentPower": 0.178, "reactivePower": -0.000, "pwrFactor": -1.000, "voltage": 1.176, "current": 0.152, "freq": 50.000 } ] }, { "eid": 704643584, "timestamp": 1695769632, "actEnergyDlvd": 2404339.266, "actEnergyRcvd": 1125590.088, "apparentEnergy": 4833861.616, "reactEnergyLagg": 22501.684, "reactEnergyLead": 1935715.220, "instantaneousDemand": 522.043, "activePower": 522.043, "apparentPower": 746.438, "reactivePower": -458.984, "pwrFactor": 0.706, "voltage": 238.282, "current": 3.138, "freq": 50.000, "channels": [ { "eid": 1778385425, "timestamp": 1695769632, "actEnergyDlvd": 2404339.266, "actEnergyRcvd": 1125590.088, "apparentEnergy": 4833861.616, "reactEnergyLagg": 22501.684, "reactEnergyLead": 1935715.220, "instantaneousDemand": 522.043, "activePower": 522.043, "apparentPower": 746.438, "reactivePower": -458.984, "pwrFactor": 0.706, "voltage": 238.282, "current": 3.138, "freq": 50.000 }, { "eid": 1778385426, "timestamp": 1695769632, "actEnergyDlvd": 0.000, "actEnergyRcvd": 1099.941, "apparentEnergy": 54.285, "reactEnergyLagg": 356.336, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 3.447, "current": 0.000, "freq": 50.000 }, { "eid": 1778385427, "timestamp": 1695769632, "actEnergyDlvd": 0.000, "actEnergyRcvd": 5670.302, "apparentEnergy": 8802.177, "reactEnergyLagg": 361.519, "reactEnergyLead": 0.367, "instantaneousDemand": -0.351, "activePower": -0.351, "apparentPower": 1.761, "reactivePower": -0.000, "pwrFactor": 0.000, "voltage": 8.942, "current": 0.197, "freq": 50.000 } ] } ] ivp_meters_readings_log.json000066400000000000000000000004361464551303400345160ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "4835", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_sc_pvlimit000066400000000000000000000000611464551303400317540ustar00rootroot00000000000000{ "enable": false, "pv_limit_pct": 100 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_sc_pvlimit_log.json000066400000000000000000000004341464551303400335710ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "48", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} ivp_ss_dry_contact_settings000066400000000000000000000027271464551303400344750ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{ "dry_contacts": [ { "id": "NC1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NC2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "override": "false", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] } ] } ivp_ss_dry_contact_settings_log.json000066400000000000000000000004361464551303400363010ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-length": "1494", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_ss_gen_config000066400000000000000000000000031464551303400324020ustar00rootroot00000000000000{} ivp_ss_gen_config_log.json000066400000000000000000000004331464551303400341430ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_ss_gen_schedule000066400000000000000000000000031464551303400327310ustar00rootroot00000000000000{} ivp_ss_gen_schedule_log.json000066400000000000000000000004331464551303400344720ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/ivp_ss_pel_settings000066400000000000000000000000251464551303400330100ustar00rootroot00000000000000{ "PEL": false } ivp_ss_pel_settings_log.json000066400000000000000000000004341464551303400345460ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "20", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/production000066400000000000000000000026051464551303400311210ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":5,"readingTime":0,"wNow":0,"whLifetime":45349},{"type":"eim","activeCount":1,"measurementType":"production","readingTime":1695769630,"wNow":-0.0,"whLifetime":2432969.956,"varhLeadLifetime":7.266,"varhLagLifetime":392075.308,"vahLifetime":2709025.327,"rmsCurrent":0.387,"rmsVoltage":238.473,"reactPwr":83.545,"apprntPwr":92.2,"pwrFactor":0.0,"whToday":0.956,"whLastSevenDays":73002.956,"vahToday":11.327,"varhLeadToday":0.266,"varhLagToday":10.308}],"consumption":[{"type":"eim","activeCount":1,"measurementType":"total-consumption","readingTime":1695769630,"wNow":519.156,"whLifetime":3711429.458,"varhLeadLifetime":1935707.698,"varhLagLifetime":-369573.624,"vahLifetime":4833861.2,"rmsCurrent":3.504,"rmsVoltage":238.335,"reactPwr":-374.948,"apprntPwr":835.18,"pwrFactor":0.62,"whToday":63.458,"whLastSevenDays":19.458,"vahToday":89.2,"varhLeadToday":54.698,"varhLagToday":0.0},{"type":"eim","activeCount":1,"measurementType":"net-consumption","readingTime":1695769630,"wNow":519.156,"whLifetime":1279038.272,"varhLeadLifetime":1935714.965,"varhLagLifetime":22501.684,"vahLifetime":4833861.2,"rmsCurrent":3.117,"rmsVoltage":238.335,"reactPwr":-458.493,"apprntPwr":742.91,"pwrFactor":0.7,"whToday":0,"whLastSevenDays":0,"vahToday":0,"varhLeadToday":0,"varhLagToday":0}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/production.json000066400000000000000000000026201464551303400320660ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":5,"readingTime":0,"wNow":0,"whLifetime":45349},{"type":"eim","activeCount":1,"measurementType":"production","readingTime":1695769629,"wNow":-0.957,"whLifetime":2432969.956,"varhLeadLifetime":7.266,"varhLagLifetime":392075.259,"vahLifetime":2709025.274,"rmsCurrent":0.387,"rmsVoltage":238.522,"reactPwr":83.521,"apprntPwr":92.383,"pwrFactor":0.0,"whToday":0.956,"whLastSevenDays":73002.956,"vahToday":11.274,"varhLeadToday":0.266,"varhLagToday":10.259}],"consumption":[{"type":"eim","activeCount":1,"measurementType":"total-consumption","readingTime":1695769629,"wNow":523.579,"whLifetime":3711429.155,"varhLeadLifetime":1935707.431,"varhLagLifetime":-369573.576,"vahLifetime":4833860.766,"rmsCurrent":3.513,"rmsVoltage":238.507,"reactPwr":-374.915,"apprntPwr":837.87,"pwrFactor":0.62,"whToday":63.155,"whLastSevenDays":19.155,"vahToday":88.766,"varhLeadToday":54.431,"varhLagToday":0.0},{"type":"eim","activeCount":1,"measurementType":"net-consumption","readingTime":1695769629,"wNow":524.536,"whLifetime":1279037.969,"varhLeadLifetime":1935714.697,"varhLagLifetime":22501.684,"vahLifetime":4833860.766,"rmsCurrent":3.126,"rmsVoltage":238.507,"reactPwr":-458.436,"apprntPwr":745.663,"pwrFactor":0.7,"whToday":0,"whLastSevenDays":0,"vahToday":0,"varhLeadToday":0,"varhLagToday":0}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/production.json_log.json000066400000000000000000000006131464551303400336770ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:09 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/7.6.185_with_cts_and_battery_3t/production_log.json000066400000000000000000000006131464551303400327270ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/000077500000000000000000000000001464551303400220225ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/api_v1_production000066400000000000000000000001641464551303400253730ustar00rootroot00000000000000{ "wattHoursToday": 54042, "wattHoursSevenDays": 1455161, "wattHoursLifetime": 1509203, "wattsNow": 12997 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/api_v1_production_inverters000066400000000000000000000147671464551303400275120ustar00rootroot00000000000000[ { "serialNumber": "202314072546", "lastReportDate": 1692385844, "devType": 1, "lastReportWatts": 307, "maxReportWatts": 319 }, { "serialNumber": "202314071516", "lastReportDate": 1692386025, "devType": 1, "lastReportWatts": 308, "maxReportWatts": 321 }, { "serialNumber": "202314058203", "lastReportDate": 1692385784, "devType": 1, "lastReportWatts": 310, "maxReportWatts": 321 }, { "serialNumber": "202314060891", "lastReportDate": 1692385785, "devType": 1, "lastReportWatts": 305, "maxReportWatts": 321 }, { "serialNumber": "202314068272", "lastReportDate": 1692385786, "devType": 1, "lastReportWatts": 311, "maxReportWatts": 324 }, { "serialNumber": "202314077078", "lastReportDate": 1692385935, "devType": 1, "lastReportWatts": 302, "maxReportWatts": 317 }, { "serialNumber": "202314065062", "lastReportDate": 1692385935, "devType": 1, "lastReportWatts": 277, "maxReportWatts": 334 }, { "serialNumber": "202314073012", "lastReportDate": 1692385787, "devType": 1, "lastReportWatts": 308, "maxReportWatts": 323 }, { "serialNumber": "202314070713", "lastReportDate": 1692385936, "devType": 1, "lastReportWatts": 309, "maxReportWatts": 326 }, { "serialNumber": "202314071845", "lastReportDate": 1692385846, "devType": 1, "lastReportWatts": 308, "maxReportWatts": 324 }, { "serialNumber": "202314069065", "lastReportDate": 1692385847, "devType": 1, "lastReportWatts": 303, "maxReportWatts": 320 }, { "serialNumber": "202314068868", "lastReportDate": 1692385904, "devType": 1, "lastReportWatts": 304, "maxReportWatts": 318 }, { "serialNumber": "202314066216", "lastReportDate": 1692385965, "devType": 1, "lastReportWatts": 309, "maxReportWatts": 319 }, { "serialNumber": "202314073251", "lastReportDate": 1692385937, "devType": 1, "lastReportWatts": 307, "maxReportWatts": 323 }, { "serialNumber": "202314073205", "lastReportDate": 1692385938, "devType": 1, "lastReportWatts": 304, "maxReportWatts": 321 }, { "serialNumber": "202314050286", "lastReportDate": 1692385966, "devType": 1, "lastReportWatts": 312, "maxReportWatts": 327 }, { "serialNumber": "202314072420", "lastReportDate": 1692385967, "devType": 1, "lastReportWatts": 305, "maxReportWatts": 321 }, { "serialNumber": "202314073257", "lastReportDate": 1692385907, "devType": 1, "lastReportWatts": 309, "maxReportWatts": 322 }, { "serialNumber": "202314070647", "lastReportDate": 1692385939, "devType": 1, "lastReportWatts": 301, "maxReportWatts": 319 }, { "serialNumber": "202314071660", "lastReportDate": 1692385995, "devType": 1, "lastReportWatts": 310, "maxReportWatts": 322 }, { "serialNumber": "202314069086", "lastReportDate": 1692385968, "devType": 1, "lastReportWatts": 313, "maxReportWatts": 323 }, { "serialNumber": "202314055790", "lastReportDate": 1692385969, "devType": 1, "lastReportWatts": 305, "maxReportWatts": 321 }, { "serialNumber": "202314071753", "lastReportDate": 1692385996, "devType": 1, "lastReportWatts": 276, "maxReportWatts": 337 }, { "serialNumber": "202314061330", "lastReportDate": 1692385997, "devType": 1, "lastReportWatts": 269, "maxReportWatts": 336 }, { "serialNumber": "202314073428", "lastReportDate": 1692385942, "devType": 1, "lastReportWatts": 311, "maxReportWatts": 324 }, { "serialNumber": "202314065647", "lastReportDate": 1692385969, "devType": 1, "lastReportWatts": 303, "maxReportWatts": 319 }, { "serialNumber": "202314062558", "lastReportDate": 1692385971, "devType": 1, "lastReportWatts": 301, "maxReportWatts": 322 }, { "serialNumber": "202314070107", "lastReportDate": 1692385971, "devType": 1, "lastReportWatts": 308, "maxReportWatts": 317 }, { "serialNumber": "202314059855", "lastReportDate": 1692385973, "devType": 1, "lastReportWatts": 309, "maxReportWatts": 322 }, { "serialNumber": "202314063524", "lastReportDate": 1692385998, "devType": 1, "lastReportWatts": 276, "maxReportWatts": 337 }, { "serialNumber": "202314062880", "lastReportDate": 1692386026, "devType": 1, "lastReportWatts": 275, "maxReportWatts": 335 }, { "serialNumber": "202314070988", "lastReportDate": 1692386027, "devType": 1, "lastReportWatts": 275, "maxReportWatts": 334 }, { "serialNumber": "202314065032", "lastReportDate": 1692386029, "devType": 1, "lastReportWatts": 273, "maxReportWatts": 336 }, { "serialNumber": "202314062224", "lastReportDate": 1692385974, "devType": 1, "lastReportWatts": 304, "maxReportWatts": 318 }, { "serialNumber": "202314064007", "lastReportDate": 1692386029, "devType": 1, "lastReportWatts": 307, "maxReportWatts": 325 }, { "serialNumber": "202314067482", "lastReportDate": 1692385977, "devType": 1, "lastReportWatts": 302, "maxReportWatts": 318 }, { "serialNumber": "202314070321", "lastReportDate": 1692386030, "devType": 1, "lastReportWatts": 271, "maxReportWatts": 329 }, { "serialNumber": "202314070523", "lastReportDate": 1692385978, "devType": 1, "lastReportWatts": 305, "maxReportWatts": 320 }, { "serialNumber": "202314071599", "lastReportDate": 1692385978, "devType": 1, "lastReportWatts": 307, "maxReportWatts": 317 }, { "serialNumber": "202314068438", "lastReportDate": 1692385979, "devType": 1, "lastReportWatts": 293, "maxReportWatts": 324 }, { "serialNumber": "202314069944", "lastReportDate": 1692385814, "devType": 1, "lastReportWatts": 277, "maxReportWatts": 336 }, { "serialNumber": "202314075069", "lastReportDate": 1692385999, "devType": 1, "lastReportWatts": 308, "maxReportWatts": 319 }, { "serialNumber": "202314070295", "lastReportDate": 1692386032, "devType": 1, "lastReportWatts": 275, "maxReportWatts": 335 }, { "serialNumber": "202314069092", "lastReportDate": 1692385980, "devType": 1, "lastReportWatts": 309, "maxReportWatts": 319 } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/api_v1_production_inverters_log.json000066400000000000000000000005021464551303400313010ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 18 Aug 2023 19:14:41 GMT", "content-type": "application/json", "content-length": "6647", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/api_v1_production_log.json000066400000000000000000000005011464551303400271770ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 18 Aug 2023 19:14:41 GMT", "content-type": "application/json", "content-length": "116", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/info000066400000000000000000000036611464551303400227060ustar00rootroot00000000000000 xxxxxxxxxxxx 800-00664-r05 D8.1.41 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 3eb4d3 590-00019-r01 02.00.01 1f421b 500-00002-r01 08.01.41 7d531e 500-00004-r01 01.02.436 3faed5 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 90916f 500-00012-r01 02.02.00 e3a10d 500-00020-r01 31.07.09 59f6df 500-00016-r01 02.00.00 54a6dc 500-00021-r01 01.00.00 19ae14 1684430967 ec2-user-envoy_uber-pkg_master:pkg-May-18-23-17:27:28 pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/info_log.json000066400000000000000000000005751464551303400245200ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 18 Aug 2023 19:14:41 GMT", "content-type": "text/xml", "content-length": "1969", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/ivp_ensemble_dry_contacts000066400000000000000000000005171464551303400271740ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "closed" }, { "id": "NC2", "status": "closed" }, { "id": "NO1", "status": "open" }, { "id": "NO2", "status": "open" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/ivp_ensemble_dry_contacts_log.json000066400000000000000000000004351464551303400310040ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 18 Aug 2023 19:14:45 GMT", "content-length": "334", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/ivp_ensemble_inventory000066400000000000000000000064341464551303400265410ustar00rootroot00000000000000[ { "type": "ENCHARGE", "devices": [ { "part_num": "836-01826-r76", "serial_num": "492319002585", "installed": 1691560591, "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1692385816, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1691560591, "img_load_date": 1691560591, "img_pnum_running": "3.0.5949_rel/31.07", "bmu_fw_version": "3.8.53", "communicating": true, "sleep_enabled": false, "percentFull": 100, "temperature": 42, "maxCellTemp": 42, "comm_level_sub_ghz": 0, "comm_level_2_4_ghz": 0, "led_status": 14, "dc_switch_off": false, "encharge_rev": 3, "encharge_capacity": 4960, "phase": "ph-a", "der_index": 2 }, { "part_num": "836-01826-r76", "serial_num": "492319002593", "installed": 1691560590, "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1692386075, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1691560590, "img_load_date": 1691560590, "img_pnum_running": "3.0.5949_rel/31.07", "bmu_fw_version": "3.8.53", "communicating": true, "sleep_enabled": false, "percentFull": 85, "temperature": 42, "maxCellTemp": 42, "comm_level_sub_ghz": 0, "comm_level_2_4_ghz": 0, "led_status": 14, "dc_switch_off": false, "encharge_rev": 3, "encharge_capacity": 4960, "phase": "ph-a", "der_index": 2 } ] }, { "type": "ENPOWER", "devices": [ { "part_num": "865-00377-r28", "serial_num": "482326083757", "installed": 1691648499, "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1692386076, "admin_state": 24, "admin_state_str": "ENPWR_STATE_OPER_CLOSED", "created_date": 1691648499, "img_load_date": 1691648499, "img_pnum_running": "3.0.5177_rel/31.07", "communicating": true, "temperature": 113, "comm_level_sub_ghz": 0, "comm_level_2_4_ghz": 0, "mains_admin_state": "closed", "mains_oper_state": "closed", "Enpwr_grid_mode": "multimode-ongrid", "Enchg_grid_mode": "multimode-ongrid", "Enpwr_relay_state_bm": 3568, "Enpwr_curr_state_id": 16 } ] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/ivp_ensemble_inventory_log.json000066400000000000000000000004361464551303400303460ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 18 Aug 2023 19:14:45 GMT", "content-length": "3355", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/ivp_ensemble_power000066400000000000000000000005401464551303400256300ustar00rootroot00000000000000{ "devices:": [ { "serial_num": "492319002585", "real_power_mw": 24000, "apparent_power_mva": 24000, "soc": 100 }, { "serial_num": "492319002593", "real_power_mw": 16000, "apparent_power_mva": 16000, "soc": 85 } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/ivp_ensemble_power_log.json000066400000000000000000000004351464551303400274440ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 18 Aug 2023 19:14:45 GMT", "content-length": "351", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/ivp_ensemble_secctrl000066400000000000000000000015571464551303400261440ustar00rootroot00000000000000{ "shutdown": false, "freq_bias_hz": -1.348230004310608, "voltage_bias_v": -16.190109252929689, "freq_bias_hz_q8": -2168, "voltage_bias_v_q5": -518, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 30, "adjusted_backup_soc": 30, "agg_soc": 92, "Max_energy": 9920, "ENC_agg_soc": 92, "ENC_agg_soh": 100, "ENC_agg_backup_energy": 2976, "ENC_agg_avail_energy": 9176, "Enc_commissioned_capacity": 9920, "Enc_max_available_capacity": 9920, "ACB_agg_soc": 0, "ACB_agg_energy": 0, "VLS_Limit": 10, "Recovery_threshold_soc": 13, "Commission_in_progress": false } pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/ivp_ensemble_secctrl_log.json000066400000000000000000000004351464551303400277470ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 18 Aug 2023 19:14:45 GMT", "content-length": "878", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/ivp_ensemble_status000066400000000000000000000361171464551303400260300ustar00rootroot00000000000000{ "inventory": { "serial_nums": { "202323119466": { "device_type": 22, "com_interface_str": "USB", "device_id": "202323119466", "admin_state": 43, "admin_state_str": "ENS_DEVICE_STATE_READY", "msg_retry_count": 0, "part_number": "800-01821-r05", "assembly_number": "880-01821-r05", "app_fw_version": "3.0.203_rel/31.07", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "", "bmu_fw_version": "", "submodule_count": 1, "submodules": { "202323119466": { "device_type": 24, "admin_state": 1, "part_number": "800-01821-r05", "assembly_number": "880-01821-r05", "dmir": { "part_number": "546-00003-01", "assembly_number": "01" }, "procload": { "part_number": "522-00003-01", "assembly_number": "3.0.203_rel/31.07" } } } }, "482326083757": { "device_type": 17, "com_interface_str": "CAN", "device_id": "482326083757", "admin_state": 24, "admin_state_str": "ENPWR_STATE_OPER_CLOSED", "msg_retry_count": 0, "part_number": "865-00377-r28", "assembly_number": "885-00377-r29", "app_fw_version": "3.0.5177_rel/31.07", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "", "bmu_fw_version": "", "submodule_count": 2, "submodules": { "482325046860": { "device_type": 18, "admin_state": 1, "part_number": "800-01820-r05", "assembly_number": "800-01820-r05", "dmir": { "part_number": "546-00003-01", "assembly_number": "01" }, "procload": { "part_number": "522-00003-01", "assembly_number": "3.0.5177_rel/31.07" } }, "482325061898": { "device_type": 20, "admin_state": 1, "part_number": "800-01861-r01", "assembly_number": "800-01861-r01", "dmir": { "part_number": "546-00003-01", "assembly_number": "01" }, "procload": { "part_number": "", "assembly_number": "" } } } }, "492319002585": { "device_type": 13, "com_interface_str": "CAN", "device_id": "492319002585", "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "multimode-ongrid", "phase": "ph-a", "der_index": 2, "encharge_revision": 3, "encharge_capacity": 4960, "encharge_rated_power": 3840, "msg_retry_count": 2, "part_number": "836-01826-r76", "assembly_number": "892-00024-r78", "app_fw_version": "3.0.5949_rel/31.07", "ibl_fw_version": "3.1.739-b352e2", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "3.8.53", "submodule_count": 7, "submodules": { "122316087241": { "device_type": 14, "admin_state": 1, "part_number": "800-01729-r02", "assembly_number": "880-01691-r31", "dmir": { "part_number": "549-00056-r01", "assembly_number": "004.031.001-D00031" }, "procload": { "part_number": "52100008R001", "assembly_number": "004.031.001-D00031" } }, "122316087307": { "device_type": 14, "admin_state": 1, "part_number": "800-01729-r02", "assembly_number": "880-01691-r31", "dmir": { "part_number": "549-00056-r01", "assembly_number": "004.031.001-D00031" }, "procload": { "part_number": "52100008R001", "assembly_number": "004.031.001-D00031" } }, "122316095294": { "device_type": 14, "admin_state": 1, "part_number": "800-01729-r02", "assembly_number": "880-01691-r31", "dmir": { "part_number": "549-00056-r01", "assembly_number": "004.031.001-D00031" }, "procload": { "part_number": "52100008R001", "assembly_number": "004.031.001-D00031" } }, "122316103880": { "device_type": 14, "admin_state": 1, "part_number": "800-01729-r02", "assembly_number": "880-01691-r31", "dmir": { "part_number": "549-00056-r01", "assembly_number": "004.031.001-D00031" }, "procload": { "part_number": "52100008R001", "assembly_number": "004.031.001-D00031" } }, "122316104646": { "device_type": 14, "admin_state": 1, "part_number": "800-01729-r02", "assembly_number": "880-01691-r31", "dmir": { "part_number": "549-00056-r01", "assembly_number": "004.031.001-D00031" }, "procload": { "part_number": "52100008R001", "assembly_number": "004.031.001-D00031" } }, "122316105765": { "device_type": 14, "admin_state": 1, "part_number": "800-01729-r02", "assembly_number": "880-01691-r31", "dmir": { "part_number": "549-00056-r01", "assembly_number": "004.031.001-D00031" }, "procload": { "part_number": "52100008R001", "assembly_number": "004.031.001-D00031" } }, "492318006311": { "device_type": 15, "admin_state": 1, "part_number": "800-00329-r06", "assembly_number": "880-00329-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "3.0.5949_rel/31.07" } } } }, "492319002593": { "device_type": 13, "com_interface_str": "CAN", "device_id": "492319002593", "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "multimode-ongrid", "phase": "ph-a", "der_index": 2, "encharge_revision": 3, "encharge_capacity": 4960, "encharge_rated_power": 3840, "msg_retry_count": 2, "part_number": "836-01826-r76", "assembly_number": "892-00024-r78", "app_fw_version": "3.0.5949_rel/31.07", "ibl_fw_version": "3.1.739-b352e2", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "3.8.53", "submodule_count": 7, "submodules": { "122316086919": { "device_type": 14, "admin_state": 1, "part_number": "800-01729-r02", "assembly_number": "880-01691-r31", "dmir": { "part_number": "549-00056-r01", "assembly_number": "004.031.001-D00031" }, "procload": { "part_number": "52100008R001", "assembly_number": "004.031.001-D00031" } }, "122316087121": { "device_type": 14, "admin_state": 1, "part_number": "800-01729-r02", "assembly_number": "880-01691-r31", "dmir": { "part_number": "549-00056-r01", "assembly_number": "004.031.001-D00031" }, "procload": { "part_number": "52100008R001", "assembly_number": "004.031.001-D00031" } }, "122316095271": { "device_type": 14, "admin_state": 1, "part_number": "800-01729-r02", "assembly_number": "880-01691-r31", "dmir": { "part_number": "549-00056-r01", "assembly_number": "004.031.001-D00031" }, "procload": { "part_number": "52100008R001", "assembly_number": "004.031.001-D00031" } }, "122316103381": { "device_type": 14, "admin_state": 1, "part_number": "800-01729-r02", "assembly_number": "880-01691-r31", "dmir": { "part_number": "549-00056-r01", "assembly_number": "004.031.001-D00031" }, "procload": { "part_number": "52100008R001", "assembly_number": "004.031.001-D00031" } }, "122316104060": { "device_type": 14, "admin_state": 1, "part_number": "800-01729-r02", "assembly_number": "880-01691-r31", "dmir": { "part_number": "549-00056-r01", "assembly_number": "004.031.001-D00031" }, "procload": { "part_number": "52100008R001", "assembly_number": "004.031.001-D00031" } }, "122316105394": { "device_type": 14, "admin_state": 1, "part_number": "800-01729-r02", "assembly_number": "880-01691-r31", "dmir": { "part_number": "549-00056-r01", "assembly_number": "004.031.001-D00031" }, "procload": { "part_number": "52100008R001", "assembly_number": "004.031.001-D00031" } }, "492319000225": { "device_type": 15, "admin_state": 1, "part_number": "800-00329-r06", "assembly_number": "880-00329-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "3.0.5949_rel/31.07" } } } } } }, "secctrl": { "shutdown": false, "freq_bias_hz": -1.348230004310608, "voltage_bias_v": -16.190109252929689, "freq_bias_hz_q8": -2168, "voltage_bias_v_q5": -518, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 30, "adjusted_backup_soc": 30, "agg_soc": 92, "Max_energy": 9920, "ENC_agg_soc": 92, "ENC_agg_soh": 100, "ENC_agg_backup_energy": 2976, "ENC_agg_avail_energy": 9176, "Enc_commissioned_capacity": 9920, "Enc_max_available_capacity": 9920, "ACB_agg_soc": 0, "ACB_agg_energy": 0, "VLS_Limit": 10, "Recovery_threshold_soc": 13, "Commission_in_progress": false }, "relay": { "mains_admin_state": "closed", "mains_oper_state": "closed", "der1_state": 1, "der2_state": 1, "der3_state": 0, "Enchg_grid_mode": "multimode-ongrid", "Solar_grid_mode": "multimode-ongrid" }, "fakeit": { "fake_inventory_mode": false } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/ivp_ensemble_status_log.json000066400000000000000000000004371464551303400276350ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 18 Aug 2023 19:14:45 GMT", "content-length": "15438", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/ivp_ss_dry_contact_settings000066400000000000000000000043261464551303400275660ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "type": "LOAD", "grid_action": "apply", "micro_grid_action": "apply", "gen_action": "apply", "essential_start_time": 21600.0, "essential_end_time": 82800.0, "priority": 1.0, "black_s_start": 5.0, "override": "true", "manual_override": "true", "load_name": "Furnace", "mode": "soc", "soc_low": 30.0, "soc_high": 40.0, "pv_serial_nb": [] }, { "id": "NC2", "type": "LOAD", "grid_action": "apply", "micro_grid_action": "apply", "gen_action": "apply", "essential_start_time": 21600.0, "essential_end_time": 82800.0, "priority": 2.0, "black_s_start": 5.0, "override": "true", "manual_override": "true", "load_name": "AC", "mode": "soc", "soc_low": 30.0, "soc_high": 40.0, "pv_serial_nb": [] }, { "id": "NO1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "essential_start_time": 21600.0, "essential_end_time": 82800.0, "priority": 3.0, "black_s_start": 5.0, "override": "false", "manual_override": "true", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 40.0, "pv_serial_nb": [] }, { "id": "NO2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "essential_start_time": 21600.0, "essential_end_time": 82800.0, "priority": 4.0, "black_s_start": 5.0, "override": "false", "manual_override": "true", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 40.0, "pv_serial_nb": [] } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/ivp_ss_dry_contact_settings_log.json000066400000000000000000000004361464551303400313750ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 18 Aug 2023 19:14:45 GMT", "content-length": "2261", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/production000066400000000000000000000026751464551303400241450ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":44,"readingTime":1692386032,"wNow":13163,"whLifetime":348363},{"type":"eim","activeCount":1,"measurementType":"production","readingTime":1692386085,"wNow":13028.191,"whLifetime":1510205.886,"varhLeadLifetime":857.879,"varhLagLifetime":204751.113,"vahLifetime":1746691.161,"rmsCurrent":108.273,"rmsVoltage":246.903,"reactPwr":76.03,"apprntPwr":13365.877,"pwrFactor":0.97,"whToday":55044.886,"whLastSevenDays":1456163.886,"vahToday":64285.161,"varhLeadToday":33.879,"varhLagToday":8551.113}],"consumption":[{"type":"eim","activeCount":1,"measurementType":"total-consumption","readingTime":1692386085,"wNow":5210.062,"whLifetime":1757946.028,"varhLeadLifetime":108784.489,"varhLagLifetime":29678.386,"vahLifetime":1607139.674,"rmsCurrent":40.644,"rmsVoltage":246.9,"reactPwr":1402.145,"apprntPwr":5016.45,"pwrFactor":1.0,"whToday":0.0,"whLastSevenDays":0.0,"vahToday":1190803.674,"varhLeadToday":104827.489,"varhLagToday":17207.386},{"type":"eim","activeCount":1,"measurementType":"net-consumption","readingTime":1692386085,"wNow":-7818.129,"whLifetime":247925.322,"varhLeadLifetime":109642.368,"varhLagLifetime":234429.5,"vahLifetime":1607139.674,"rmsCurrent":-67.629,"rmsVoltage":246.9,"reactPwr":1326.115,"apprntPwr":-8349.832,"pwrFactor":-1.0,"whToday":0,"whLastSevenDays":0,"vahToday":0,"varhLeadToday":0,"varhLagToday":0}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/production.json000066400000000000000000000027041464551303400251060ustar00rootroot00000000000000{"production":[{"type":"inverters","activeCount":44,"readingTime":1692386032,"wNow":13163,"whLifetime":348363},{"type":"eim","activeCount":1,"measurementType":"production","readingTime":1692386083,"wNow":13028.54,"whLifetime":1510198.655,"varhLeadLifetime":857.879,"varhLagLifetime":204751.071,"vahLifetime":1746683.744,"rmsCurrent":108.274,"rmsVoltage":246.894,"reactPwr":77.802,"apprntPwr":13367.009,"pwrFactor":0.97,"whToday":55037.655,"whLastSevenDays":1456156.655,"vahToday":64277.744,"varhLeadToday":33.879,"varhLagToday":8551.071}],"consumption":[{"type":"eim","activeCount":1,"measurementType":"total-consumption","readingTime":1692386083,"wNow":5216.083,"whLifetime":1757943.133,"varhLeadLifetime":108784.489,"varhLagLifetime":29677.693,"vahLifetime":1607135.036,"rmsCurrent":40.571,"rmsVoltage":246.894,"reactPwr":1407.058,"apprntPwr":5007.246,"pwrFactor":1.0,"whToday":0.0,"whLastSevenDays":0.0,"vahToday":1190799.036,"varhLeadToday":104827.489,"varhLagToday":17206.693},{"type":"eim","activeCount":1,"measurementType":"net-consumption","readingTime":1692386083,"wNow":-7812.457,"whLifetime":247929.658,"varhLeadLifetime":109642.368,"varhLagLifetime":234428.764,"vahLifetime":1607135.036,"rmsCurrent":-67.703,"rmsVoltage":246.894,"reactPwr":1329.256,"apprntPwr":-8358.792,"pwrFactor":-1.0,"whToday":0,"whLastSevenDays":0,"vahToday":0,"varhLeadToday":0,"varhLagToday":0}],"storage":[{"type":"acb","activeCount":0,"readingTime":0,"wNow":0,"whNow":0,"state":"idle"}]} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/production.json_log.json000066400000000000000000000006131464551303400267140ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 18 Aug 2023 19:14:43 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.1.41/production_log.json000066400000000000000000000006131464551303400257440ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Fri, 18 Aug 2023 19:14:45 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/000077500000000000000000000000001464551303400276665ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/admin_lib_tariff000066400000000000000000000314111464551303400330620ustar00rootroot00000000000000{ "tariff": { "currency": { "code": "USD" }, "logger": "mylogger", "date": "1709367413", "storage_settings": { "mode": "self-consumption", "operation_mode_sub_type": "prioritize-energy", "reserved_soc": 20, "very_low_soc": 10, "charge_from_grid": false, "date": "1709339757" }, "single_rate": { "rate": 0.321370005607605, "sell": 0.00009899999713525176 }, "seasons": [ { "id": "summer", "start": "6/1", "days": [ { "id": "weekdays", "days": "Mon,Tue,Wed,Thu,Fri", "must_charge_start": 0, "must_charge_duration": 0, "must_charge_mode": "CP", "peak_rule": "DL", "enable_discharge_to_grid": false, "periods": [ { "id": "filler", "start": 0, "rate": 0.321370005607605 }, { "id": "period_2", "start": 900, "rate": 0.5212500095367432 }, { "id": "period_1", "start": 960, "rate": 0.6300299763679504 }, { "id": "period_3", "start": 1260, "rate": 0.5212500095367432 }, { "id": "filler", "start": 1439, "rate": 0.321370005607605 } ] }, { "id": "weekend", "days": "Sat,Sun", "must_charge_start": 0, "must_charge_duration": 0, "must_charge_mode": "CP", "peak_rule": "DL", "enable_discharge_to_grid": false, "periods": [ { "id": "filler", "start": 0, "rate": 0.321370005607605 }, { "id": "period_2", "start": 900, "rate": 0.5212500095367432 }, { "id": "period_1", "start": 960, "rate": 0.6300299763679504 }, { "id": "period_3", "start": 1260, "rate": 0.5212500095367432 }, { "id": "filler", "start": 1439, "rate": 0.321370005607605 } ] } ], "tiers": [] }, { "id": "winter", "start": "10/1", "days": [ { "id": "weekdays", "days": "Mon,Tue,Wed,Thu,Fri", "must_charge_start": 0, "must_charge_duration": 0, "must_charge_mode": "CP", "peak_rule": "DL", "enable_discharge_to_grid": false, "periods": [ { "id": "filler", "start": 0, "rate": 0.3213590085506439 }, { "id": "period_2", "start": 900, "rate": 0.4895789921283722 }, { "id": "period_1", "start": 960, "rate": 0.5047900080680847 }, { "id": "period_3", "start": 1260, "rate": 0.4895789921283722 }, { "id": "filler", "start": 1439, "rate": 0.3213590085506439 } ] }, { "id": "weekend", "days": "Sat,Sun", "must_charge_start": 0, "must_charge_duration": 0, "must_charge_mode": "CP", "peak_rule": "DL", "enable_discharge_to_grid": false, "periods": [ { "id": "filler", "start": 0, "rate": 0.3213590085506439 }, { "id": "period_2", "start": 900, "rate": 0.4895789921283722 }, { "id": "period_1", "start": 960, "rate": 0.5047900080680847 }, { "id": "period_3", "start": 1260, "rate": 0.4895789921283722 }, { "id": "filler", "start": 1439, "rate": 0.3213590085506439 } ] } ], "tiers": [] } ], "seasons_sell": [] }, "schedule": { "filename": "Tariff", "source": "Tariff", "date": "2024-03-06 22:58:46 UTC", "version": "00.00.02", "reserved_soc": 20, "very_low_soc": 10, "charge_from_grid": false, "batt_mode": "self-consumption", "battery_mode": "self-consumption", "operation_mode_sub_type": "prioritize-energy", "override": false, "override_backup_soc": 30, "override_chg_dischg_rate": 0, "override_tou_mode": "StorageTouMode_DEFAULT_TOU_MODE", "schedule": { "Disable": [ { "Sun": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Mon": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Tue": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Wed": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Thu": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Fri": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Sat": [ { "start": 0, "duration": 1440, "setting": "ID" } ] } ], "tariff": [ { "start": "6/1", "end": "10/1", "Sun": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Mon": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Tue": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Wed": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Thu": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Fri": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Sat": [ { "start": 0, "duration": 1440, "setting": "ZN" } ] }, { "start": "10/1", "end": "6/1", "Sun": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Mon": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Tue": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Wed": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Thu": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Fri": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Sat": [ { "start": 0, "duration": 1440, "setting": "ZN" } ] } ] } } } admin_lib_tariff_log.json000066400000000000000000000006131464551303400346140ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:11 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/api_v1_production000066400000000000000000000001521464551303400332340ustar00rootroot00000000000000{ "wattHoursToday": 0, "wattHoursSevenDays": 73002, "wattHoursLifetime": 2432969, "wattsNow": 0 } api_v1_production_inverters000066400000000000000000000013541464551303400352630ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split[ { "serialNumber": "482243033113", "lastReportDate": 1695752919, "devType": 1, "lastReportWatts": 0, "maxReportWatts": 361 }, { "serialNumber": "482246043645", "lastReportDate": 1695752947, "devType": 1, "lastReportWatts": 0, "maxReportWatts": 361 }, { "serialNumber": "482246047675", "lastReportDate": 1695752865, "devType": 1, "lastReportWatts": 0, "maxReportWatts": 361 }, { "serialNumber": "482246047880", "lastReportDate": 1695752936, "devType": 1, "lastReportWatts": 0, "maxReportWatts": 360 }, { "serialNumber": "482243033093", "lastReportDate": 1695752940, "devType": 1, "lastReportWatts": 0, "maxReportWatts": 362 } ] api_v1_production_inverters_log.json000066400000000000000000000005011464551303400370650ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:08 GMT", "content-type": "application/json", "content-length": "748", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} api_v1_production_log.json000066400000000000000000000005011464551303400347640ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:08 GMT", "content-type": "application/json", "content-length": "106", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/info000066400000000000000000000040071464551303400305450ustar00rootroot00000000000000 123456789012 800-00654-r08 D8.2.127 4c8675 0 1 true true 500-00001-r01 02.00.00 1210 500-00011-r02 04.04.225 3eb4d3 590-00019-r01 02.00.01 1f421b 500-00002-r01 07.06.185 97768a 500-00005-r01 01.02.439 a930df 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 eaa252 500-00012-r01 02.02.00 f41c50 500-00020-r01 22.11.46 5ffaa1 500-00016-r01 02.00.00 54a6dc 500-00021-r01 01.00.00 19ae14 ec2-user-envoy_uber-pkg_master:pkg-Jun-22-23-18:55:22 1687460237 02.00.4238 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/info_log.json000066400000000000000000000005751464551303400323640ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:08 GMT", "content-type": "text/xml", "content-length": "2055", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} ivp_ensemble_dry_contacts000066400000000000000000000005231464551303400347560ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{ "dry_contacts": [ { "id": "NC1", "status": "closed" }, { "id": "NC2", "status": "closed" }, { "id": "NO1", "status": "closed" }, { "id": "NO2", "status": "closed" } ] } ivp_ensemble_dry_contacts_log.json000066400000000000000000000004351464551303400365710ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-length": "330", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} ivp_ensemble_generator000066400000000000000000000002771464551303400342560ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{ "admin_state": "unknown", "oper_state": "open", "admin_mode": 0, "schedule": 0, "start_soc": 100, "stop_soc": -1, "exc_on": 0, "present": 1, "type": 0 } ivp_ensemble_generator_log.json000066400000000000000000000004351464551303400360630ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "190", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} ivp_ensemble_inventory000066400000000000000000000154211464551303400343220ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split[ { "type": "ENCHARGE", "devices": [ { "part_num": "836-01826-r76", "serial_num": "12345678901006", "installed": 1709749530, "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1709829434, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1709749530, "img_load_date": 1709749530, "img_pnum_running": "3.0.6614_rel/31.13", "bmu_fw_version": "3.8.63", "communicating": true, "sleep_enabled": false, "percentFull": 21, "temperature": 12, "maxCellTemp": 12, "reported_enc_grid_state": "grid-tied", "comm_level_sub_ghz": 0, "comm_level_2_4_ghz": 0, "led_status": 12, "dc_switch_off": false, "encharge_rev": 3, "encharge_capacity": 5000, "phase": "ph-a", "der_index": 2 }, { "part_num": "836-01826-r76", "serial_num": "12345678901005", "installed": 1709410199, "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1709829256, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1709410199, "img_load_date": 1709410199, "img_pnum_running": "3.0.6614_rel/31.13", "bmu_fw_version": "3.8.63", "communicating": true, "sleep_enabled": false, "percentFull": 21, "temperature": 11, "maxCellTemp": 12, "reported_enc_grid_state": "grid-tied", "comm_level_sub_ghz": 0, "comm_level_2_4_ghz": 0, "led_status": 12, "dc_switch_off": false, "encharge_rev": 3, "encharge_capacity": 5000, "phase": "ph-a", "der_index": 2 }, { "part_num": "836-01826-r76", "serial_num": "12345678901004", "installed": 1707622567, "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1709829437, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1707622567, "img_load_date": 1707622567, "img_pnum_running": "3.0.6614_rel/31.13", "bmu_fw_version": "3.8.63", "communicating": true, "sleep_enabled": false, "percentFull": 21, "temperature": 12, "maxCellTemp": 12, "reported_enc_grid_state": "grid-tied", "comm_level_sub_ghz": 0, "comm_level_2_4_ghz": 0, "led_status": 12, "dc_switch_off": false, "encharge_rev": 3, "encharge_capacity": 5000, "phase": "ph-a", "der_index": 2 }, { "part_num": "836-01826-r76", "serial_num": "12345678901003", "installed": 1706749292, "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1709829288, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1706749292, "img_load_date": 1706749292, "img_pnum_running": "3.0.6614_rel/31.13", "bmu_fw_version": "3.8.63", "communicating": true, "sleep_enabled": false, "percentFull": 21, "temperature": 12, "maxCellTemp": 12, "reported_enc_grid_state": "grid-tied", "comm_level_sub_ghz": 0, "comm_level_2_4_ghz": 0, "led_status": 12, "dc_switch_off": false, "encharge_rev": 3, "encharge_capacity": 5000, "phase": "ph-a", "der_index": 2 }, { "part_num": "836-01826-r81", "serial_num": "12345678901002", "installed": 1707197622, "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1709829328, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1707197622, "img_load_date": 1707197622, "img_pnum_running": "3.0.6614_rel/31.13", "bmu_fw_version": "3.8.63", "communicating": true, "sleep_enabled": false, "percentFull": 21, "temperature": 13, "maxCellTemp": 13, "reported_enc_grid_state": "grid-tied", "comm_level_sub_ghz": 0, "comm_level_2_4_ghz": 0, "led_status": 12, "dc_switch_off": false, "encharge_rev": 3, "encharge_capacity": 5000, "phase": "ph-a", "der_index": 3 } ] }, { "type": "ENPOWER", "devices": [ { "part_num": "865-00378-r27", "serial_num": "12345678901001", "installed": 1709657837, "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1709829514, "admin_state": 24, "admin_state_str": "ENPWR_STATE_OPER_CLOSED", "created_date": 1709657837, "img_load_date": 1709657837, "img_pnum_running": "3.0.5654_rel/31.13", "communicating": true, "temperature": 72, "comm_level_sub_ghz": 0, "comm_level_2_4_ghz": 0, "mains_admin_state": "closed", "mains_oper_state": "closed", "Enpwr_grid_mode": "multimode-ongrid", "Enchg_grid_mode": "multimode-ongrid", "Enpwr_relay_state_bm": 15868, "Enpwr_curr_state_id": 16 } ] } ] ivp_ensemble_inventory_log.json000066400000000000000000000004361464551303400361330ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-length": "1189", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/ivp_ensemble_power000066400000000000000000000014011464551303400334710ustar00rootroot00000000000000{ "devices:": [ { "serial_num": "12345678901006", "real_power_mw": -136000, "apparent_power_mva": -136000, "soc": 21 }, { "serial_num": "12345678901005", "real_power_mw": -128000, "apparent_power_mva": -128000, "soc": 21 }, { "serial_num": "12345678901004", "real_power_mw": -128000, "apparent_power_mva": -128000, "soc": 21 }, { "serial_num": "12345678901003", "real_power_mw": -128000, "apparent_power_mva": -128000, "soc": 21 }, { "serial_num": "12345678901002", "real_power_mw": -121000, "apparent_power_mva": -121000, "soc": 21 } ] } ivp_ensemble_power_log.json000066400000000000000000000004351464551303400352310ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-length": "180", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/ivp_ensemble_secctrl000066400000000000000000000017071464551303400340050ustar00rootroot00000000000000{ "shutdown": false, "freq_bias_hz": -0.06000090762972832, "voltage_bias_v": -0.7205159664154053, "freq_bias_hz_q8": -96, "voltage_bias_v_q5": -23, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 20, "adjusted_backup_soc": 20, "agg_soc": 21, "Max_energy": 25000, "ENC_agg_soc": 21, "ENC_agg_soh": 100, "ENC_agg_backup_energy": 5000, "ENC_agg_avail_energy": 5250, "Enc_commissioned_capacity": 25000, "Enc_max_available_capacity": 25000, "ACB_agg_soc": 0, "ACB_agg_energy": 0, "VLS_Limit": 10, "soc_rec_enabled": false, "soc_recovery_entry": 2, "soc_recovery_exit": 10, "Commission_in_progress": false, "ESS_in_progress": false } ivp_ensemble_secctrl_log.json000066400000000000000000000004351464551303400355340ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-length": "781", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/ivp_ensemble_status000066400000000000000000000212501464551303400336640ustar00rootroot00000000000000{ "inventory": { "serial_nums": { "122249097612": { "device_type": 13, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "grid-tied", "phase": 1, "encharge_revision": 2, "encharge_capacity": 3500, "encharge_rated_power": 1280, "msg_retry_count": 1, "part_number": "830-01760-r37", "assembly_number": "890-00023-r39", "app_fw_version": "2.6.5973_rel/22.11", "zb_fw_version": "100F", "zb_bootloader_vers": "1.B.5", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "2.1.34", "submodule_count": 6, "submodules": { "122248094067": { "device_type": 16, "admin_state": 1, "part_number": "620-00291-r02", "assembly_number": "800-00291-r02", "dmir": { "part_number": "", "assembly_number": "" }, "procload": { "part_number": "490-00154", "assembly_number": "2.1.34" } }, "122249004224": { "device_type": 14, "admin_state": 1, "part_number": "800-01335-r01", "assembly_number": "880-01335-r10", "dmir": { "part_number": "549-00030-r00", "assembly_number": "3.28.2-D48" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.28.2-D48" } }, "122249016424": { "device_type": 14, "admin_state": 1, "part_number": "800-01335-r01", "assembly_number": "880-01335-r10", "dmir": { "part_number": "549-00030-r00", "assembly_number": "3.28.2-D48" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.28.2-D48" } }, "122249017193": { "device_type": 14, "admin_state": 1, "part_number": "800-01335-r01", "assembly_number": "880-01335-r10", "dmir": { "part_number": "549-00030-r00", "assembly_number": "3.28.2-D48" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.28.2-D48" } }, "122249017363": { "device_type": 14, "admin_state": 1, "part_number": "800-01335-r01", "assembly_number": "880-01335-r10", "dmir": { "part_number": "549-00030-r00", "assembly_number": "3.28.2-D48" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.28.2-D48" } }, "122249045297": { "device_type": 15, "admin_state": 1, "part_number": "800-01854-r06", "assembly_number": "800-01854-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "2.6.5973_rel/22.11" } } } } } }, "counters": { "api_ecagtInit": 1, "api_ecagtTick": 4271944, "api_ecagtDeviceInsert": 4, "api_ecagtDeviceNetworkStatus": 57950, "api_ecagtDeviceCommissionStatus": 25, "api_ecagtDeviceRemoved": 2, "api_ecagtGetDeviceCount": 4325203, "api_ecagtGetDeviceInfo": 4323962, "api_ecagtGetOneDeviceInfo": 14, "api_ecagtDevIdToSerial": 82006, "api_ecagtHandleMsg": 80765, "api_ecagtGetSubmoduleInv": 8929, "api_ecagtGetDataModelRaw": 23255, "api_ecagtSetSecCtrlBias": 387023, "api_ecagtGetSecCtrlBias": 26704, "api_ecagtGetSecCtrlBiasQ": 23498, "api_ecagtGetRelayState": 5127595, "api_ecagtSetDataModelCache": 1, "api_AggNameplate": 14, "api_ecagtGetGridFreq": 854388, "api_ecagtGetGridVolt": 854388, "api_ecagtGetGridFreq_err_notfound": 854388, "rest_StatusGet": 18, "rest_SleepGet": 1, "rest_InventoryGet": 19843, "rest_SubmodGet": 7670, "rest_SecCtrlGet": 23481, "rest_RelayGet": 6, "rest_RelayPost": 1, "rest_CommCheckGet": 599, "rest_Power": 19252, "ext_zb_send_msg": 397049, "ext_cfg_save_device": 4, "ext_cfg_save_device_err": 4, "ext_send_perf_data": 77997, "ext_event_set_stateful": 7087, "ext_event_set_modgone": 28, "rxmsg_OBJ_MDL_META_RSP": 4, "rxmsg_OBJ_MDL_INV_UPD_RSP": 305, "rxmsg_OBJ_MDL_POLL_RSP": 77997, "rxmsg_OBJ_MDL_GRID_STATUS_RSP": 8, "rxmsg_OBJ_MDL_EVENTS_MSG": 2387, "rxmsg_OBJ_MDL_SOC_CONFIG_RSP": 14, "txmsg_OBJ_MDL_META_REQ": 8, "txmsg_OBJ_MDL_ENC_RT_POLL_REQ": 17, "txmsg_OBJ_MDL_BMU_POLL_REQ": 3553, "txmsg_OBJ_MDL_PCU_POLL_REQ": 3553, "txmsg_OBJ_MDL_SECONDARY_CTRL_REQ": 387023, "txmsg_OBJ_MDL_GRID_STATUS_REQ": 8, "txmsg_OBJ_MDL_EVENTS_ACK": 2387, "txmsg_OBJ_MDL_SOC_CONFIG_REQ": 14, "txmsg_OBJ_MDL_TNS_START": 16, "rxmsg_OBJ_MDL_TNS_START_RSP": 16, "txmsg_OBJ_MDL_SET_UDMIR": 19, "rxmsg_OBJ_MDL_SET_UDMIR_RSP": 18, "txmsg_OBJ_MDL_TNS_END": 16, "rxmsg_OBJ_MDL_TNS_END_RSP": 16, "txmsg_lvs_poll": 435, "zmq_ecaHello": 1, "zmq_ecaDevInfo": 33, "zmq_ecaNetworkStatus": 57950, "zmq_ecaAppMsg": 80765, "zmq_streamdata": 854388, "zmq_live_debug": 3206, "zmq_eca_live_debug_req": 160, "zmq_nameplate": 138, "zmq_ecaSecCtrlMsg": 387023, "zmq_meterlog_ok": 1, "dmdl_FILES_INDEXED": 3, "devPollMissing": 12056, "gridProfileTransaction": 32, "fsm_retry_timeout": 8, "profile_txn_ack": 16, "backupSocLimitSet": 388486, "backupSocLimitChanged": 8, "api_ecagtGetGenRelayState": 854390 }, "secctrl": { "shutdown": false, "freq_bias_hz": 1.3899999856948853, "voltage_bias_v": 16.899999618530275, "freq_bias_hz_q8": 2235, "voltage_bias_v_q5": 540, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 15, "adjusted_backup_soc": 15, "agg_soc": 15, "Max_energy": 3500, "ENC_agg_soc": 15, "ENC_agg_soh": 100, "ENC_agg_backup_energy": 525, "ENC_agg_avail_energy": 525, "Enc_commissioned_capacity": 3500, "Enc_max_available_capacity": 3500, "ACB_agg_soc": 0, "ACB_agg_energy": 0 }, "relay": { "mains_admin_state": "closed", "mains_oper_state": "closed", "der1_state": 0, "der2_state": 0, "Enchg_grid_mode": "grid-tied", "Solar_grid_mode": "unknown" }, "profile": { "message": "Obsolete API, please use ivp/arf/profile" }, "fakeit": { "fake_inventory_mode": false } } ivp_ensemble_status_log.json000066400000000000000000000004361464551303400354210ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-length": "8871", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/ivp_meters000066400000000000000000000012501464551303400317640ustar00rootroot00000000000000[ { "eid": 704643328, "state": "enabled", "measurementType": "production", "phaseMode": "split", "phaseCount": 2, "meteringStatus": "normal", "statusFlags": [] }, { "eid": 704643584, "state": "enabled", "measurementType": "net-consumption", "phaseMode": "split", "phaseCount": 2, "meteringStatus": "normal", "statusFlags": [] }, { "eid": 704643840, "state": "enabled", "measurementType": "storage", "phaseMode": "split", "phaseCount": 2, "meteringStatus": "normal", "statusFlags": [] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/ivp_meters_log.json000066400000000000000000000004351464551303400336010ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "457", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/ivp_meters_readings000066400000000000000000000142551464551303400336510ustar00rootroot00000000000000[ { "eid": 704643328, "timestamp": 1709829517, "actEnergyDlvd": 3165834.272, "actEnergyRcvd": 75.689, "apparentEnergy": 5529628.28, "reactEnergyLagg": 1607325.212, "reactEnergyLead": 68551.981, "instantaneousDemand": 1714.424, "activePower": 1714.424, "apparentPower": 2100.04, "reactivePower": 20.865, "pwrFactor": 0.817, "voltage": 242.367, "current": 17.326, "freq": 60.0, "channels": [ { "eid": 1778385169, "timestamp": 1709829517, "actEnergyDlvd": 1581746.293, "actEnergyRcvd": 45.89, "apparentEnergy": 2763520.42, "reactEnergyLagg": 803725.479, "reactEnergyLead": 33935.538, "instantaneousDemand": 856.031, "activePower": 856.031, "apparentPower": 1049.732, "reactivePower": 8.366, "pwrFactor": 0.822, "voltage": 121.224, "current": 8.658, "freq": 60.0 }, { "eid": 1778385170, "timestamp": 1709829517, "actEnergyDlvd": 1584087.979, "actEnergyRcvd": 29.799, "apparentEnergy": 2766107.86, "reactEnergyLagg": 803599.733, "reactEnergyLead": 34616.443, "instantaneousDemand": 858.394, "activePower": 858.394, "apparentPower": 1050.307, "reactivePower": 12.499, "pwrFactor": 0.812, "voltage": 121.143, "current": 8.668, "freq": 60.0 }, { "eid": 1778385171, "timestamp": 1709829517, "actEnergyDlvd": 0.0, "actEnergyRcvd": 0.0, "apparentEnergy": 0.0, "reactEnergyLagg": 0.0, "reactEnergyLead": 0.0, "instantaneousDemand": 0.0, "activePower": 0.0, "apparentPower": 0.0, "reactivePower": 0.0, "pwrFactor": 0.0, "voltage": 0.0, "current": 0.0, "freq": 60.0 } ] }, { "eid": 704643584, "timestamp": 1709829517, "actEnergyDlvd": 4998251.825, "actEnergyRcvd": 253960.783, "apparentEnergy": 12810156.532, "reactEnergyLagg": 185.037, "reactEnergyLead": 9170599.668, "instantaneousDemand": 129.407, "activePower": 129.407, "apparentPower": 2578.068, "reactivePower": -2230.583, "pwrFactor": 0.034, "voltage": 242.553, "current": 21.241, "freq": 60.0, "channels": [ { "eid": 1778385425, "timestamp": 1709829517, "actEnergyDlvd": 2631217.196, "actEnergyRcvd": 93777.056, "apparentEnergy": 6787276.689, "reactEnergyLagg": 79.572, "reactEnergyLead": 5042497.945, "instantaneousDemand": -201.39, "activePower": -201.39, "apparentPower": 1130.056, "reactivePower": -935.571, "pwrFactor": -0.193, "voltage": 121.334, "current": 9.316, "freq": 60.0 }, { "eid": 1778385426, "timestamp": 1709829517, "actEnergyDlvd": 2367034.629, "actEnergyRcvd": 160183.727, "apparentEnergy": 6022879.843, "reactEnergyLagg": 105.465, "reactEnergyLead": 4128101.723, "instantaneousDemand": 330.797, "activePower": 330.797, "apparentPower": 1448.012, "reactivePower": -1295.012, "pwrFactor": 0.212, "voltage": 121.219, "current": 11.925, "freq": 60.0 }, { "eid": 1778385427, "timestamp": 1709829517, "actEnergyDlvd": 1137498.944, "actEnergyRcvd": 1486121.902, "apparentEnergy": 3935472.955, "reactEnergyLagg": 1355134.893, "reactEnergyLead": 31326.355, "instantaneousDemand": -464.966, "activePower": -464.966, "apparentPower": 640.741, "reactivePower": 377.197, "pwrFactor": -0.713, "voltage": 121.248, "current": 5.259, "freq": 60.0 } ] }, { "eid": 704643840, "timestamp": 1709829517, "actEnergyDlvd": 2274358.602, "actEnergyRcvd": 2971414.344, "apparentEnergy": 7881024.906, "reactEnergyLagg": 2713630.41, "reactEnergyLead": 62717.621, "instantaneousDemand": -2579.823, "activePower": -2579.823, "apparentPower": 461.253, "reactivePower": 676.781, "pwrFactor": -1.0, "voltage": 242.582, "current": 14.575, "freq": 60.0, "channels": [ { "eid": 1778385681, "timestamp": 1709829517, "actEnergyDlvd": 1136859.658, "actEnergyRcvd": 1485292.441, "apparentEnergy": 3945551.951, "reactEnergyLagg": 1358495.518, "reactEnergyLead": 31391.267, "instantaneousDemand": -2114.856, "activePower": -2114.856, "apparentPower": -179.488, "reactivePower": 299.583, "pwrFactor": -0.193, "voltage": 121.334, "current": 9.316, "freq": 60.0 }, { "eid": 1778385682, "timestamp": 1709829517, "actEnergyDlvd": 1137498.944, "actEnergyRcvd": 1486121.902, "apparentEnergy": 3935472.955, "reactEnergyLagg": 1355134.893, "reactEnergyLead": 31326.355, "instantaneousDemand": -464.966, "activePower": -464.966, "apparentPower": 640.741, "reactivePower": 377.197, "pwrFactor": -0.713, "voltage": 121.248, "current": 5.259, "freq": 60.0 }, { "eid": 1778385683, "timestamp": 1709829517, "actEnergyDlvd": 0.0, "actEnergyRcvd": 0.0, "apparentEnergy": 0.0, "reactEnergyLagg": 0.0, "reactEnergyLead": 0.0, "instantaneousDemand": 0.0, "activePower": 0.0, "apparentPower": 0.0, "reactivePower": 0.0, "pwrFactor": 0.0, "voltage": 0.0, "current": 0.0, "freq": 0.0 } ] } ] ivp_meters_readings_log.json000066400000000000000000000004361464551303400353770ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "4835", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/ivp_sc_pvlimit000066400000000000000000000000611464551303400326350ustar00rootroot00000000000000{ "enable": false, "pv_limit_pct": 100 } ivp_sc_pvlimit_log.json000066400000000000000000000004341464551303400343730ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "48", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} ivp_ss_dry_contact_settings000066400000000000000000000042371464551303400353540ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{ "dry_contacts": [ { "id": "NC1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "essential_start_time": 32400, "essential_end_time": 57600, "priority": 1, "black_s_start": 5, "override": "false", "manual_override": "true", "load_name": "", "mode": "manual", "soc_low": 30, "soc_high": 40, "pv_serial_nb": [] }, { "id": "NC2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "essential_start_time": 32400, "essential_end_time": 57600, "priority": 2, "black_s_start": 5, "override": "false", "manual_override": "true", "load_name": "", "mode": "manual", "soc_low": 30, "soc_high": 40, "pv_serial_nb": [] }, { "id": "NO1", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "essential_start_time": 32400, "essential_end_time": 57600, "priority": 3, "black_s_start": 5, "override": "false", "manual_override": "true", "load_name": "", "mode": "manual", "soc_low": 30, "soc_high": 40, "pv_serial_nb": [] }, { "id": "NO2", "type": "NONE", "grid_action": "none", "micro_grid_action": "none", "gen_action": "none", "essential_start_time": 32400, "essential_end_time": 57600, "priority": 4, "black_s_start": 5, "override": "false", "manual_override": "true", "load_name": "", "mode": "manual", "soc_low": 30, "soc_high": 40, "pv_serial_nb": [] } ] } ivp_ss_dry_contact_settings_log.json000066400000000000000000000004361464551303400371620ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-length": "1494", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/ivp_ss_gen_config000066400000000000000000000000031464551303400332630ustar00rootroot00000000000000{} ivp_ss_gen_config_log.json000066400000000000000000000004331464551303400350240ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/ivp_ss_gen_schedule000066400000000000000000000000031464551303400336120ustar00rootroot00000000000000{} ivp_ss_gen_schedule_log.json000066400000000000000000000004331464551303400353530ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "2", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/ivp_ss_pel_settings000066400000000000000000000000251464551303400336710ustar00rootroot00000000000000{ "PEL": false } ivp_ss_pel_settings_log.json000066400000000000000000000004341464551303400354270ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:12 GMT", "content-length": "20", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/production000066400000000000000000000043231464551303400320010ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 35, "readingTime": 1709829490, "wNow": 1592, "whLifetime": 821819 }, { "type": "eim", "activeCount": 1, "measurementType": "production", "readingTime": 1709829518, "wNow": 1714.424, "whLifetime": 3165834.272, "varhLeadLifetime": 68551.981, "varhLagLifetime": 1607325.212, "vahLifetime": 5529628.28, "rmsCurrent": 17.326, "rmsVoltage": 242.367, "reactPwr": 20.865, "apprntPwr": 2100.04, "pwrFactor": 0.82, "whToday": 1475.272, "whLastSevenDays": 3164458.272, "vahToday": 8010.28, "varhLeadToday": 0.981, "varhLagToday": 5202.212 } ], "consumption": [ { "type": "eim", "activeCount": 1, "measurementType": "total-consumption", "readingTime": 1709829518, "wNow": 1843.831, "whLifetime": 7909866.491, "varhLeadLifetime": 9102047.686, "varhLagLifetime": -1607140.175, "vahLifetime": 12810156.532, "rmsCurrent": 19.934, "rmsVoltage": 242.553, "reactPwr": -2209.719, "apprntPwr": 2416.339, "pwrFactor": 0.75, "whToday": 7596.0, "whLastSevenDays": 0.0, "vahToday": 4946716.532, "varhLeadToday": 9039334.686, "varhLagToday": 9360.0 }, { "type": "eim", "activeCount": 1, "measurementType": "net-consumption", "readingTime": 1709829518, "wNow": 129.407, "whLifetime": 4744549.864, "varhLeadLifetime": 9170599.668, "varhLagLifetime": 185.037, "vahLifetime": 12810156.532, "rmsCurrent": 2.609, "rmsVoltage": 242.553, "reactPwr": -2230.583, "apprntPwr": 315.151, "pwrFactor": 0.28, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/production.json000066400000000000000000000043231464551303400327510ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 35, "readingTime": 1709829490, "wNow": 1592, "whLifetime": 821819 }, { "type": "eim", "activeCount": 1, "measurementType": "production", "readingTime": 1709829518, "wNow": 1714.424, "whLifetime": 3165834.272, "varhLeadLifetime": 68551.981, "varhLagLifetime": 1607325.212, "vahLifetime": 5529628.28, "rmsCurrent": 17.326, "rmsVoltage": 242.367, "reactPwr": 20.865, "apprntPwr": 2100.04, "pwrFactor": 0.82, "whToday": 1475.272, "whLastSevenDays": 3164458.272, "vahToday": 8010.28, "varhLeadToday": 0.981, "varhLagToday": 5202.212 } ], "consumption": [ { "type": "eim", "activeCount": 1, "measurementType": "total-consumption", "readingTime": 1709829518, "wNow": 1843.831, "whLifetime": 7909866.491, "varhLeadLifetime": 9102047.686, "varhLagLifetime": -1607140.175, "vahLifetime": 12810156.532, "rmsCurrent": 19.934, "rmsVoltage": 242.553, "reactPwr": -2209.719, "apprntPwr": 2416.339, "pwrFactor": 0.75, "whToday": 7596.0, "whLastSevenDays": 0.0, "vahToday": 4946716.532, "varhLeadToday": 9039334.686, "varhLagToday": 9360.0 }, { "type": "eim", "activeCount": 1, "measurementType": "net-consumption", "readingTime": 1709829518, "wNow": 129.407, "whLifetime": 4744549.864, "varhLeadLifetime": 9170599.668, "varhLagLifetime": 185.037, "vahLifetime": 12810156.532, "rmsCurrent": 2.609, "rmsVoltage": 242.553, "reactPwr": -2230.583, "apprntPwr": 315.151, "pwrFactor": 0.28, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } production.json_log.json000066400000000000000000000006131464551303400345010ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:09 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_3cts_and_battery_split/production_log.json000066400000000000000000000006131464551303400336100ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Tue, 26 Sep 2023 23:07:10 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/000077500000000000000000000000001464551303400267515ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/_readme000066400000000000000000000002511464551303400302660ustar00rootroot000000000000008.2.127_with_generator_running https://github.com/pyenphase/pyenphase/issues/106#issuecomment-2163569516 Snapshot taken when generator was running during power outage pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/admin_lib_tariff000066400000000000000000000130511464551303400321450ustar00rootroot00000000000000{ "tariff": { "currency": { "code": "USD" }, "logger": "mylogger", "date": "1716803909", "storage_settings": { "mode": "self-consumption", "operation_mode_sub_type": "", "reserved_soc": 50, "very_low_soc": 10, "charge_from_grid": false, "date": "1716803909" }, "single_rate": { "rate": 0, "sell": 0.03999900072813034 }, "seasons": [ { "id": "all_year_long", "start": "1/1", "days": [ { "id": "all_days", "days": "Mon,Tue,Wed,Thu,Fri,Sat,Sun", "must_charge_start": 0, "must_charge_duration": 0, "must_charge_mode": "CP", "peak_rule": "DL", "enable_discharge_to_grid": false, "periods": [ { "id": "period_1", "start": 0, "rate": 0 } ] } ], "tiers": [] } ], "seasons_sell": [] }, "schedule": { "filename": "Tariff", "source": "Tariff", "date": "2024-05-27 10:06:36 UTC", "version": "00.00.02", "reserved_soc": 50, "very_low_soc": 10, "charge_from_grid": false, "batt_mode": "self-consumption", "battery_mode": "self-consumption", "operation_mode_sub_type": "", "override": false, "override_backup_soc": 30, "override_chg_dischg_rate": 0, "override_tou_mode": "StorageTouMode_DEFAULT_TOU_MODE", "schedule": { "Disable": [ { "Sun": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Mon": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Tue": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Wed": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Thu": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Fri": [ { "start": 0, "duration": 1440, "setting": "ID" } ] }, { "Sat": [ { "start": 0, "duration": 1440, "setting": "ID" } ] } ], "tariff": [ { "start": "1/1", "end": "1/1", "Sun": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Mon": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Tue": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Wed": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Thu": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Fri": [ { "start": 0, "duration": 1440, "setting": "ZN" } ], "Sat": [ { "start": 0, "duration": 1440, "setting": "ZN" } ] } ] } } } pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/admin_lib_tariff_log.json000066400000000000000000000004361464551303400337610ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:53 GMT", "content-length": "1788", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/api_v1_production000066400000000000000000000001621464551303400323200ustar00rootroot00000000000000{ "wattHoursToday": 2135, "wattHoursSevenDays": 359546, "wattHoursLifetime": 15096793, "wattsNow": 2248 } api_v1_production_inverters000066400000000000000000000075021464551303400343470ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running[ { "serialNumber": "482218039091", "lastReportDate": 1718213113, "devType": 1, "lastReportWatts": 67, "maxReportWatts": 122 }, { "serialNumber": "482218039209", "lastReportDate": 1718213114, "devType": 1, "lastReportWatts": 61, "maxReportWatts": 115 }, { "serialNumber": "482218039304", "lastReportDate": 1718213115, "devType": 1, "lastReportWatts": 69, "maxReportWatts": 132 }, { "serialNumber": "482218039386", "lastReportDate": 1718213116, "devType": 1, "lastReportWatts": 64, "maxReportWatts": 112 }, { "serialNumber": "482218039390", "lastReportDate": 1718213117, "devType": 1, "lastReportWatts": 63, "maxReportWatts": 123 }, { "serialNumber": "482218039529", "lastReportDate": 1718213143, "devType": 1, "lastReportWatts": 75, "maxReportWatts": 120 }, { "serialNumber": "482218039700", "lastReportDate": 1718213203, "devType": 1, "lastReportWatts": 89, "maxReportWatts": 135 }, { "serialNumber": "482218039736", "lastReportDate": 1718213204, "devType": 1, "lastReportWatts": 84, "maxReportWatts": 118 }, { "serialNumber": "482218039788", "lastReportDate": 1718213234, "devType": 1, "lastReportWatts": 95, "maxReportWatts": 100 }, { "serialNumber": "482218039880", "lastReportDate": 1718213235, "devType": 1, "lastReportWatts": 96, "maxReportWatts": 134 }, { "serialNumber": "482218039911", "lastReportDate": 1718213236, "devType": 1, "lastReportWatts": 97, "maxReportWatts": 133 }, { "serialNumber": "482218039918", "lastReportDate": 1718213237, "devType": 1, "lastReportWatts": 99, "maxReportWatts": 136 }, { "serialNumber": "482218042609", "lastReportDate": 1718213237, "devType": 1, "lastReportWatts": 95, "maxReportWatts": 107 }, { "serialNumber": "482218042662", "lastReportDate": 1718213239, "devType": 1, "lastReportWatts": 90, "maxReportWatts": 116 }, { "serialNumber": "482218042737", "lastReportDate": 1718213240, "devType": 1, "lastReportWatts": 96, "maxReportWatts": 130 }, { "serialNumber": "482218042901", "lastReportDate": 1718213242, "devType": 1, "lastReportWatts": 96, "maxReportWatts": 103 }, { "serialNumber": "482218043030", "lastReportDate": 1718213242, "devType": 1, "lastReportWatts": 95, "maxReportWatts": 102 }, { "serialNumber": "482218043257", "lastReportDate": 1718213243, "devType": 1, "lastReportWatts": 98, "maxReportWatts": 137 }, { "serialNumber": "482218043590", "lastReportDate": 1718213245, "devType": 1, "lastReportWatts": 95, "maxReportWatts": 108 }, { "serialNumber": "482218043592", "lastReportDate": 1718213264, "devType": 1, "lastReportWatts": 98, "maxReportWatts": 106 }, { "serialNumber": "482218043652", "lastReportDate": 1718213265, "devType": 1, "lastReportWatts": 101, "maxReportWatts": 107 }, { "serialNumber": "482218043981", "lastReportDate": 1718213266, "devType": 1, "lastReportWatts": 96, "maxReportWatts": 121 }, { "serialNumber": "482218047061", "lastReportDate": 1718213267, "devType": 1, "lastReportWatts": 100, "maxReportWatts": 125 }, { "serialNumber": "482218047087", "lastReportDate": 1718213268, "devType": 1, "lastReportWatts": 101, "maxReportWatts": 101 }, { "serialNumber": "482218047088", "lastReportDate": 1718213269, "devType": 1, "lastReportWatts": 98, "maxReportWatts": 104 }, { "serialNumber": "482218047099", "lastReportDate": 1718212938, "devType": 1, "lastReportWatts": 74, "maxReportWatts": 107 } ] api_v1_production_inverters_log.json000066400000000000000000000005021464551303400361510ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:48 GMT", "content-type": "application/json", "content-length": "3906", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/api_v1_production_log.json000066400000000000000000000005011464551303400341260ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:48 GMT", "content-type": "application/json", "content-length": "114", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/info000066400000000000000000000045621464551303400276360ustar00rootroot00000000000000 123456789012 800-00647-r09 D8.2.127 4c8675 0 1 true true 500-00001-r01 02.00.00 1211 500-00011-r02 04.04.225 473e45 590-00019-r01 02.00.01 1f421b 500-00002-r01 08.02.127 b9a901 500-00004-r01 01.02.475 0b79d6 500-00008-r01 02.01.24 a74d96 500-00010-r01 07.00.20 176d57 500-00013-r01 03.02.08 c6cc1e 500-00012-r01 02.02.00 46a50f 500-00020-r01 31.13.24 fca566 500-00016-r01 02.00.00 54a6dc 500-00021-r01 01.00.00 19ae14 500-00022-r01 01.00.04 2cd3479 500-00001-r01 02.00.00 1211 500-00016-r01 01.00.00 8 ec2-user-envoy_uber-pkg_master:pkg-Mar-28-23-21:17:00 1680038329 02.00.3983 700-GA pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/info_log.json000066400000000000000000000005751464551303400314470ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:48 GMT", "content-type": "text/xml", "content-length": "2418", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_ensemble_dry_contacts000066400000000000000000000005231464551303400341200ustar00rootroot00000000000000{ "dry_contacts": [ { "id": "NC1", "status": "closed" }, { "id": "NC2", "status": "closed" }, { "id": "NO1", "status": "closed" }, { "id": "NO2", "status": "closed" } ] } ivp_ensemble_dry_contacts_log.json000066400000000000000000000004351464551303400356540ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:52 GMT", "content-length": "338", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_ensemble_generator000066400000000000000000000002761464551303400334170ustar00rootroot00000000000000{ "admin_state": "close", "oper_state": "close", "admin_mode": 2, "schedule": 1, "start_soc": 100, "stop_soc": -1, "exc_on": 0, "present": 1, "type": 1 } ivp_ensemble_generator_log.json000066400000000000000000000004351464551303400351460ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:53 GMT", "content-length": "189", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_ensemble_inventory000066400000000000000000000044221464551303400334630ustar00rootroot00000000000000[ { "type": "ENCHARGE", "devices": [ { "part_num": "836-00750-r32", "serial_num": "492234001350", "installed": 1718210586, "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1718213052, "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "created_date": 1718210586, "img_load_date": 1718210586, "img_pnum_running": "2.0.6727_rel/22.15", "bmu_fw_version": "2.1.34", "communicating": true, "sleep_enabled": false, "percentFull": 98, "temperature": 27, "maxCellTemp": 27, "reported_enc_grid_state": "grid-tied", "comm_level_sub_ghz": 2, "comm_level_2_4_ghz": 2, "led_status": 12, "dc_switch_off": false, "encharge_rev": 2, "encharge_capacity": 3360, "phase": "ph-a", "der_index": 2 } ] }, { "type": "ENPOWER", "devices": [ { "part_num": "860-00376-r37", "serial_num": "122210043898", "installed": 1718209911, "device_status": [ "envoy.global.ok", "prop.done" ], "last_rpt_date": 1718213328, "admin_state": 30, "admin_state_str": "ENPWR_STATE_OPER_GEN_CLOSE", "created_date": 1718209911, "img_load_date": 1718209911, "img_pnum_running": "2.0.5729_rel/22.15", "communicating": true, "temperature": 91, "comm_level_sub_ghz": 5, "comm_level_2_4_ghz": 5, "mains_admin_state": "closed", "mains_oper_state": "open", "Enpwr_grid_mode": "multimode-ongrid", "Enchg_grid_mode": "multimode-generator", "Enpwr_relay_state_bm": 16124, "Enpwr_curr_state_id": 128 } ] } ] ivp_ensemble_inventory_log.json000066400000000000000000000004361464551303400352160ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:52 GMT", "content-length": "2321", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_ensemble_power000066400000000000000000000003031464551303400325540ustar00rootroot00000000000000{ "devices:": [ { "serial_num": "492234001350", "real_power_mw": -1250000, "apparent_power_mva": -1250000, "soc": 98 } ] } ivp_ensemble_power_log.json000066400000000000000000000004351464551303400343140ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:52 GMT", "content-length": "194", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_ensemble_secctrl000066400000000000000000000017031464551303400330640ustar00rootroot00000000000000{ "shutdown": false, "freq_bias_hz": -1.3200000524520875, "voltage_bias_v": -15.69999885559082, "freq_bias_hz_q8": -2123, "voltage_bias_v_q5": -502, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 50, "adjusted_backup_soc": 50, "agg_soc": 98, "Max_energy": 3360, "ENC_agg_soc": 98, "ENC_agg_soh": 100, "ENC_agg_backup_energy": 1680, "ENC_agg_avail_energy": 3292, "Enc_commissioned_capacity": 3360, "Enc_max_available_capacity": 3360, "ACB_agg_soc": 0, "ACB_agg_energy": 0, "VLS_Limit": 10, "soc_rec_enabled": false, "soc_recovery_entry": 0, "soc_recovery_exit": 10, "Commission_in_progress": false, "ESS_in_progress": false } ivp_ensemble_secctrl_log.json000066400000000000000000000004351464551303400346170ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:52 GMT", "content-length": "962", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_ensemble_status000066400000000000000000000176041464551303400327570ustar00rootroot00000000000000{ "inventory": { "serial_nums": { "122210043898": { "device_type": 17, "com_interface_str": "ZigBee", "device_id": "122210043898", "admin_state": 30, "admin_state_str": "ENPWR_STATE_OPER_GEN_CLOSE", "msg_retry_count": 4, "part_number": "860-00376-r37", "assembly_number": "880-00376-r39", "app_fw_version": "2.0.5729_rel/22.15", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "", "bmu_fw_version": "", "submodule_count": 2, "submodules": { "122210001626": { "device_type": 20, "admin_state": 1, "part_number": "800-01612-r04", "assembly_number": "800-01612-r04", "dmir": { "part_number": "546-00003-01", "assembly_number": "01" }, "procload": { "part_number": "", "assembly_number": "" } }, "122210036280": { "device_type": 18, "admin_state": 1, "part_number": "800-01346-r02", "assembly_number": "800-01346-r02", "dmir": { "part_number": "546-00003-01", "assembly_number": "01" }, "procload": { "part_number": "522-00003-01", "assembly_number": "2.0.5729_rel/22.15" } } } }, "492234001350": { "device_type": 13, "com_interface_str": "ZigBee", "device_id": "492234001350", "admin_state": 6, "admin_state_str": "ENCHG_STATE_READY", "reported_grid_mode": "multimode-generator", "phase": "ph-a", "der_index": 2, "encharge_revision": 2, "encharge_capacity": 3360, "encharge_rated_power": 1280, "reported_enc_grid_state": "grid-tied", "msg_retry_count": 4, "part_number": "836-00750-r32", "assembly_number": "892-00026-r33", "app_fw_version": "2.0.6727_rel/22.15", "ibl_fw_version": "1.3.413", "swift_asic_fw_version": "001.002.1.7.2", "bmu_fw_version": "2.1.34", "submodule_count": 6, "submodules": { "122231063227": { "device_type": 14, "admin_state": 1, "part_number": "800-01337-r01", "assembly_number": "880-00995-r14", "dmir": { "part_number": "549-00031-r00", "assembly_number": "3.26.2-D45" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.26.1-D45" } }, "122231080486": { "device_type": 14, "admin_state": 1, "part_number": "800-01337-r01", "assembly_number": "880-00995-r14", "dmir": { "part_number": "549-00031-r00", "assembly_number": "3.26.2-D45" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.26.1-D45" } }, "122231086320": { "device_type": 14, "admin_state": 1, "part_number": "800-01337-r01", "assembly_number": "880-00995-r14", "dmir": { "part_number": "549-00031-r00", "assembly_number": "3.26.2-D45" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.26.1-D45" } }, "122231087161": { "device_type": 14, "admin_state": 1, "part_number": "800-01337-r01", "assembly_number": "880-00995-r14", "dmir": { "part_number": "549-00031-r00", "assembly_number": "3.26.2-D45" }, "procload": { "part_number": "521-00003-r00", "assembly_number": "3.26.1-D45" } }, "492233001611": { "device_type": 15, "admin_state": 1, "part_number": "800-01853-r06", "assembly_number": "800-01853-r06", "dmir": { "part_number": "546-00002-01", "assembly_number": "01" }, "procload": { "part_number": "522-00002-01", "assembly_number": "2.0.6727_rel/22.15" } }, "492233010425": { "device_type": 16, "admin_state": 1, "part_number": "620-00292-r02", "assembly_number": "800-00292-r02", "dmir": { "part_number": "", "assembly_number": "" }, "procload": { "part_number": "", "assembly_number": "002.001.034" } } } } } }, "secctrl": { "shutdown": false, "freq_bias_hz": -1.3200000524520875, "voltage_bias_v": -15.69999885559082, "freq_bias_hz_q8": -2123, "voltage_bias_v_q5": -502, "freq_bias_hz_phaseb": 0.0, "voltage_bias_v_phaseb": 0.0, "freq_bias_hz_q8_phaseb": 0, "voltage_bias_v_q5_phaseb": 0, "freq_bias_hz_phasec": 0.0, "voltage_bias_v_phasec": 0.0, "freq_bias_hz_q8_phasec": 0, "voltage_bias_v_q5_phasec": 0, "configured_backup_soc": 50, "adjusted_backup_soc": 50, "agg_soc": 98, "Max_energy": 3360, "ENC_agg_soc": 98, "ENC_agg_soh": 100, "ENC_agg_backup_energy": 1680, "ENC_agg_avail_energy": 3292, "Enc_commissioned_capacity": 3360, "Enc_max_available_capacity": 3360, "ACB_agg_soc": 0, "ACB_agg_energy": 0, "VLS_Limit": 10, "soc_rec_enabled": false, "soc_recovery_entry": 0, "soc_recovery_exit": 10, "Commission_in_progress": false, "ESS_in_progress": false }, "relay": { "mains_admin_state": "closed", "mains_oper_state": "open", "der1_state": 1, "der2_state": 1, "der3_state": 0, "Enchg_grid_mode": "multimode-generator", "Solar_grid_mode": "multimode-generator" } } ivp_ensemble_status_log.json000066400000000000000000000004361464551303400345040ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:52 GMT", "content-length": "8067", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_meters000066400000000000000000000007121464551303400310510ustar00rootroot00000000000000[ { "eid": 704643328, "state": "enabled", "measurementType": "production", "phaseMode": "split", "phaseCount": 2, "meteringStatus": "normal", "statusFlags": [] }, { "eid": 704643584, "state": "enabled", "measurementType": "net-consumption", "phaseMode": "split", "phaseCount": 2, "meteringStatus": "normal", "statusFlags": [] } ] pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_meters_log.json000066400000000000000000000004351464551303400326640ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:53 GMT", "content-length": "457", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_meters_readings000066400000000000000000000114421464551303400327270ustar00rootroot00000000000000[ { "eid": 704643328, "timestamp": 1718213332, "actEnergyDlvd": 15097304.670, "actEnergyRcvd": 15.392, "apparentEnergy": 18631234.536, "reactEnergyLagg": 4116021.375, "reactEnergyLead": 7144.913, "instantaneousDemand": 2336.093, "activePower": 2336.093, "apparentPower": 2643.758, "reactivePower": -1111.839, "pwrFactor": 0.880, "voltage": 242.887, "current": 21.222, "freq": 60.062, "channels": [ { "eid": 1778385169, "timestamp": 1718213332, "actEnergyDlvd": 7551632.356, "actEnergyRcvd": 7.790, "apparentEnergy": 9315712.558, "reactEnergyLagg": 2061239.812, "reactEnergyLead": 2910.699, "instantaneousDemand": 1172.624, "activePower": 1172.624, "apparentPower": 1324.867, "reactivePower": -557.096, "pwrFactor": 0.883, "voltage": 121.774, "current": 10.607, "freq": 60.062 }, { "eid": 1778385170, "timestamp": 1718213332, "actEnergyDlvd": 7545672.313, "actEnergyRcvd": 7.603, "apparentEnergy": 9315521.977, "reactEnergyLagg": 2054781.564, "reactEnergyLead": 4234.214, "instantaneousDemand": 1163.469, "activePower": 1163.469, "apparentPower": 1318.892, "reactivePower": -554.743, "pwrFactor": 0.877, "voltage": 121.113, "current": 10.615, "freq": 60.062 }, { "eid": 1778385171, "timestamp": 1718213332, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 0.000, "current": 0.000, "freq": 60.062 } ] }, { "eid": 704643584, "timestamp": 1718213332, "actEnergyDlvd": 13632727.119, "actEnergyRcvd": 6336017.380, "apparentEnergy": 23220664.459, "reactEnergyLagg": 485728.442, "reactEnergyLead": 7723369.387, "instantaneousDemand": 195.575, "activePower": 195.575, "apparentPower": 1088.544, "reactivePower": 938.575, "pwrFactor": 0.398, "voltage": 243.047, "current": 9.098, "freq": 60.000, "channels": [ { "eid": 1778385425, "timestamp": 1718213332, "actEnergyDlvd": 7037858.755, "actEnergyRcvd": 2542489.025, "apparentEnergy": 11417171.695, "reactEnergyLagg": 417029.372, "reactEnergyLead": 4242565.474, "instantaneousDemand": 267.695, "activePower": 267.695, "apparentPower": 574.709, "reactivePower": 474.518, "pwrFactor": 0.637, "voltage": 121.856, "current": 4.859, "freq": 60.000 }, { "eid": 1778385426, "timestamp": 1718213332, "actEnergyDlvd": 6594868.364, "actEnergyRcvd": 3793528.355, "apparentEnergy": 11803492.765, "reactEnergyLagg": 68699.070, "reactEnergyLead": 3480803.913, "instantaneousDemand": -72.120, "activePower": -72.120, "apparentPower": 513.834, "reactivePower": 464.057, "pwrFactor": 0.081, "voltage": 121.192, "current": 4.239, "freq": 60.000 }, { "eid": 1778385427, "timestamp": 1718213332, "actEnergyDlvd": 0.000, "actEnergyRcvd": 0.000, "apparentEnergy": 0.000, "reactEnergyLagg": 0.000, "reactEnergyLead": 0.000, "instantaneousDemand": 0.000, "activePower": 0.000, "apparentPower": 0.000, "reactivePower": 0.000, "pwrFactor": 0.000, "voltage": 0.000, "current": 0.000, "freq": 60.000 } ] } ] ivp_meters_readings_log.json000066400000000000000000000004361464551303400344620ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:53 GMT", "content-length": "4897", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_sc_pvlimit000066400000000000000000000000611464551303400317200ustar00rootroot00000000000000{ "enable": false, "pv_limit_pct": 100 } pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_sc_pvlimit_log.json000066400000000000000000000004341464551303400335350ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:53 GMT", "content-length": "48", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} ivp_ss_dry_contact_settings000066400000000000000000000043661464551303400344420ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running{ "dry_contacts": [ { "id": "NC1", "type": "NONE", "grid_action": "apply", "micro_grid_action": "apply", "gen_action": "apply", "essential_start_time": 32400.0, "essential_end_time": 57600.0, "priority": 1.0, "black_s_start": 5.0, "override": "false", "manual_override": "true", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NC2", "type": "NONE", "grid_action": "apply", "micro_grid_action": "apply", "gen_action": "apply", "essential_start_time": 32400.0, "essential_end_time": 57600.0, "priority": 2.0, "black_s_start": 5.0, "override": "false", "manual_override": "true", "load_name": "", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO1", "type": "LOAD", "grid_action": "shed", "micro_grid_action": "shed", "gen_action": "shed", "essential_start_time": 21600.0, "essential_end_time": 82800.0, "priority": 1.0, "black_s_start": 5.0, "override": "true", "manual_override": "true", "load_name": "Fridge and Freezer", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] }, { "id": "NO2", "type": "LOAD", "grid_action": "shed", "micro_grid_action": "apply", "gen_action": "shed", "essential_start_time": 21600.0, "essential_end_time": 82800.0, "priority": 4.0, "black_s_start": 5.0, "override": "true", "manual_override": "true", "load_name": "HVAC and Furnace", "mode": "manual", "soc_low": 30.0, "soc_high": 70.0, "pv_serial_nb": [] } ] } ivp_ss_dry_contact_settings_log.json000066400000000000000000000004361464551303400362450ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:52 GMT", "content-length": "2293", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_ss_gen_config000066400000000000000000000006361464551303400323620ustar00rootroot00000000000000{ "max_cont_gen_amps": 58.3, "min_gen_loading_perc": 5, "max_gen_efficiency_perc": 100, "name_plate_rating_wat": 14.0, "start_method": "Auto", "warm_up_mins": 0, "cool_down_mins": 0, "gen_type": "Standby", "model": "G007223-0, G007224-0, G007225-0 (14kW)", "manufacturer": "Generac", "last_updated_by": "ITK", "generator_id": "", "charge_from_generator": true } pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_ss_gen_config_log.json000066400000000000000000000004351464551303400341700ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:53 GMT", "content-length": "413", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_ss_gen_schedule000066400000000000000000000020171464551303400327040ustar00rootroot00000000000000{ "exercise_config": { "freq_in_weeks": 1, "start": 750, "duration": 30, "day": "Sun" }, "default_soc": { "start_soc": 30, "stop_soc": 70 }, "schedule": { "default": [ { "id": "always_on", "start": "1/1", "end": "12/31", "days": [ { "id": "all_days", "week_days": "Mon,Tue,Wed,Thu,Fri,Sat,Sun", "periods": [ { "id": "normal_1", "start": 0.0, "duration": 1440.0, "start_soc": 100.0, "stop_soc": -1.0, "setting": "AON" } ] } ] } ] }, "last_updated_by": "ITK" } ivp_ss_gen_schedule_log.json000066400000000000000000000004361464551303400344410ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:53 GMT", "content-length": "1038", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/ivp_ss_pel_settings000066400000000000000000000004621464551303400327610ustar00rootroot00000000000000{ "PEL": false, "Hard_PEL": false, "Soft_PEL": false, "Export_Limit_Type": "Aggregate", "percent": false, "apparent": false, "PEL_Limit": 0.0, "Comm_Time_Loss": 0.0, "Resp_Time_SoftPEL": 0.0, "Resp_Time_HardPEL": 0.0, "msReset_HardPEL": 0.0, "PEL_db": 0.0 } ivp_ss_pel_settings_log.json000066400000000000000000000004351464551303400345130ustar00rootroot00000000000000pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:53 GMT", "content-length": "305", "connection": "keep-alive", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/production000066400000000000000000000047521464551303400310720ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 26, "readingTime": 1718213270, "wNow": 2317, "whLifetime": 1107526 }, { "type": "eim", "activeCount": 1, "measurementType": "production", "readingTime": 1718213332, "wNow": 2437.721, "whLifetime": 15097304.021, "varhLeadLifetime": 7144.584, "varhLagLifetime": 4116021.375, "vahLifetime": 18631233.77, "rmsCurrent": 22.613, "rmsVoltage": 242.804, "reactPwr": -1107.42, "apprntPwr": 2717.651, "pwrFactor": 0.92, "whToday": 2646.021, "whLastSevenDays": 360057.021, "vahToday": 2965.77, "varhLeadToday": 959.584, "varhLagToday": 3.375 } ], "consumption": [ { "type": "eim", "activeCount": 1, "measurementType": "total-consumption", "readingTime": 1718213332, "wNow": 2617.159, "whLifetime": 22392009.154, "varhLeadLifetime": 7716224.803, "varhLagLifetime": -3630293.203, "vahLifetime": 23220664.118, "rmsCurrent": 22.863, "rmsVoltage": 242.997, "reactPwr": -190.291, "apprntPwr": 2780.716, "pwrFactor": 0.93, "whToday": 3334.154, "whLastSevenDays": 883.154, "vahToday": 1586.118, "varhLeadToday": 0, "varhLagToday": 598 }, { "type": "eim", "activeCount": 1, "measurementType": "net-consumption", "readingTime": 1718213332, "wNow": 179.438, "whLifetime": 7298714.106, "varhLeadLifetime": 7723369.387, "varhLagLifetime": 485728.172, "vahLifetime": 23220664.118, "rmsCurrent": 0.25, "rmsVoltage": 242.997, "reactPwr": 917.129, "apprntPwr": 33.312, "pwrFactor": 1, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/production.json000066400000000000000000000047541464551303400320440ustar00rootroot00000000000000{ "production": [ { "type": "inverters", "activeCount": 26, "readingTime": 1718213270, "wNow": 2317, "whLifetime": 1107526 }, { "type": "eim", "activeCount": 1, "measurementType": "production", "readingTime": 1718213330, "wNow": 2429.661, "whLifetime": 15097303.35, "varhLeadLifetime": 7144.262, "varhLagLifetime": 4116021.375, "vahLifetime": 18631233.018, "rmsCurrent": 22.389, "rmsVoltage": 242.897, "reactPwr": -1090.238, "apprntPwr": 2707.323, "pwrFactor": 0.92, "whToday": 2645.35, "whLastSevenDays": 360056.35, "vahToday": 2965.018, "varhLeadToday": 959.262, "varhLagToday": 3.375 } ], "consumption": [ { "type": "eim", "activeCount": 1, "measurementType": "total-consumption", "readingTime": 1718213330, "wNow": 2670.058, "whLifetime": 22392008.448, "varhLeadLifetime": 7716225.126, "varhLagLifetime": -3630293.476, "vahLifetime": 23220663.814, "rmsCurrent": 22.811, "rmsVoltage": 243.1, "reactPwr": -197.689, "apprntPwr": 2775.526, "pwrFactor": 0.92, "whToday": 3333.448, "whLastSevenDays": 882.448, "vahToday": 1585.814, "varhLeadToday": 0.0, "varhLagToday": 598.0 }, { "type": "eim", "activeCount": 1, "measurementType": "net-consumption", "readingTime": 1718213330, "wNow": 240.397, "whLifetime": 7298714.07, "varhLeadLifetime": 7723369.387, "varhLagLifetime": 485727.899, "vahLifetime": 23220663.814, "rmsCurrent": 0.422, "rmsVoltage": 243.1, "reactPwr": 892.549, "apprntPwr": 54.157, "pwrFactor": 1.0, "whToday": 0, "whLastSevenDays": 0, "vahToday": 0, "varhLeadToday": 0, "varhLagToday": 0 } ], "storage": [ { "type": "acb", "activeCount": 0, "readingTime": 0, "wNow": 0, "whNow": 0, "state": "idle" } ] } pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/production.json_log.json000066400000000000000000000006131464551303400336430ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:50 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/fixtures/8.2.127_with_generator_running/production_log.json000066400000000000000000000006131464551303400326730ustar00rootroot00000000000000{"headers": {"server": "openresty/1.17.8.1", "date": "Wed, 12 Jun 2024 17:28:52 GMT", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "keep-alive", "pragma": "no-cache", "expires": "1", "cache-control": "no-cache", "strict-transport-security": "max-age=63072000; includeSubdomains", "x-frame-options": "DENY", "x-content-type-options": "nosniff"}, "code": 200} pyenphase-pyenphase-1bfa6dd/tests/syrupy.py000066400000000000000000000031501464551303400213440ustar00rootroot00000000000000from dataclasses import asdict, is_dataclass from typing import Any from syrupy.extensions import AmberSnapshotExtension from syrupy.extensions.amber import AmberDataSerializer from syrupy.types import ( PropertyFilter, PropertyMatcher, PropertyPath, SerializableData, SerializedData, ) class EnphaseSnapshotSerializer(AmberDataSerializer): """Enphase snapshot serializer for Syrupy. Handles special cases for Enphase data structures. """ @classmethod def _serialize( cls, data: SerializableData, *, depth: int = 0, exclude: PropertyFilter | None = None, include: PropertyFilter | None = None, matcher: PropertyMatcher | None = None, path: PropertyPath = (), visited: set[Any] | None = None, ) -> SerializedData: """Pre-process data before serializing. This allows us to handle specific cases for Enphase data structures. """ serializable_data = data if is_dataclass(data): serializable_data = asdict(data) return super()._serialize( serializable_data, depth=depth, exclude=exclude, include=include, matcher=matcher, path=path, visited=visited, ) class EnphaseSnapshotExtension(AmberSnapshotExtension): """Enphase extension for Syrupy.""" VERSION = "1" """Current version of serialization format. Need to be bumped when we change the EnphasenapshotSerializer. """ serializer_class: type[AmberDataSerializer] = EnphaseSnapshotSerializer pyenphase-pyenphase-1bfa6dd/tests/test_auth.py000066400000000000000000000306111464551303400217730ustar00rootroot00000000000000"""Test auth functions.""" import json import logging from os import listdir from os.path import isfile, join from unittest.mock import patch import jwt import pytest import respx from httpx import Response from pyenphase import Envoy, EnvoyTokenAuth from pyenphase.auth import EnvoyLegacyAuth from pyenphase.const import URL_AUTH_CHECK_JWT from pyenphase.exceptions import EnvoyAuthenticationError, EnvoyAuthenticationRequired from .common import ( get_mock_envoy, load_fixture, load_json_fixture, prep_envoy, start_7_firmware_mock, ) LOGGER = logging.getLogger(__name__) @pytest.mark.asyncio @respx.mock async def test_wrong_auth_order_with_7_6_175_standard(): """Test data collected fails before auth is done""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version, info=True) envoy = Envoy("127.0.0.1") await envoy.setup() with pytest.raises(EnvoyAuthenticationRequired): await envoy.update() # now in correct order await envoy.authenticate("username", "password") data = await envoy.update() assert data @pytest.mark.asyncio @respx.mock async def test_with_3_9_36_firmware_bad_auth(): """Verify with 3.9.36 firmware with incorrect auth.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.9.36_bad_auth" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock(return_value=Response(404)) respx.get("/production.json").mock(return_value=Response(404)) respx.get("/api/v1/production").mock( return_value=Response(401, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(401)) respx.get("/ivp/meters").mock(return_value=Response(200, json=[])) with pytest.raises(EnvoyAuthenticationRequired): await get_mock_envoy() @pytest.mark.asyncio @respx.mock async def test_production_with_3_9_36_firmware_bad_auth(): """Test Authentication failed for http://127.0.0.1/api/v1/production.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.9.36_bad_auth" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock(return_value=Response(404)) respx.get("/production.json").mock(return_value=Response(404)) respx.get("/api/v1/production").mock( return_value=Response(401, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(401)) respx.get("/ivp/meters").mock(return_value=Response(200, json=[])) with pytest.raises(EnvoyAuthenticationRequired): await get_mock_envoy() @pytest.mark.parametrize( ( "username", "password", ), [ ("installer", ""), ("envoy", ""), ], ) @pytest.mark.asyncio @respx.mock async def test_known_users_with_3_9_36_firmware(username: str, password: str) -> None: """Test successful login with known usernames.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.9.36" prep_envoy(version, info=True) envoy = Envoy("127.0.0.1") await envoy.setup() await envoy.authenticate(username, password) # test cookies function now cookies are not on request used_cookies = getattr(envoy.auth, "cookies") assert used_cookies == {} data = await envoy.update() assert data # cov: force test failure of Digest authentication for local Envoy. assert isinstance(envoy.auth, EnvoyLegacyAuth) envoy.auth.local_password = "" assert envoy.auth.auth is None @pytest.mark.asyncio @respx.mock async def test_unknown_user_with_3_9_36_firmware(): """Test Could not setup authentication object with 3.9.x""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.9.36" prep_envoy(version, info=True, inverters=False) envoy = Envoy("127.0.0.1") await envoy.setup() with pytest.raises(EnvoyAuthenticationRequired): await envoy.authenticate("unknown", None) @pytest.mark.parametrize( ( "username", "password", ), [ ("installer", ""), ("envoy", ""), ("unknown", ""), ], ) @pytest.mark.asyncio @respx.mock async def test_blank_passwords_with_7_6_175_standard( username: str, password: str ) -> None: """Test Could not setup authentication object with 7.6.x""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version, info=True) envoy = Envoy("127.0.0.1") await envoy.setup() with pytest.raises(EnvoyAuthenticationRequired): await envoy.authenticate(username, password) @pytest.mark.asyncio @respx.mock async def test_no_token_obtained_with_7_6_175_standard() -> None: """Test Unable to obtain token for Envoy authentication""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version, info=True) with patch("pyenphase.EnvoyTokenAuth._obtain_token", return_value=None): envoy = Envoy("127.0.0.1") await envoy.setup() with pytest.raises(EnvoyAuthenticationError): await envoy.authenticate("username", "password") @pytest.mark.asyncio @respx.mock async def test_jwt_failure_with_7_6_175_standard() -> None: """Test Unable to verify token for Envoy authentication""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version, info=True) respx.get(URL_AUTH_CHECK_JWT).mock(return_value=Response(404, text="no jwt")) envoy = Envoy("127.0.0.1") await envoy.setup() with pytest.raises(EnvoyAuthenticationError): await envoy.authenticate("username", "password") @pytest.mark.asyncio @respx.mock async def test_no_remote_login_with_7_6_175_standard() -> None: """Test Unable to login to Enlighten to obtain session ID from https://enlighten.enphaseenergy.com/login/login.json?""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version, info=True) respx.post("https://enlighten.enphaseenergy.com/login/login.json?").mock( return_value=Response( 500, json={ "session_id": "1234567890", "user_id": "1234567890", "user_name": "test", "first_name": "Test", "is_consumer": True, "manager_token": "1234567890", }, ) ) respx.post("https://entrez.enphaseenergy.com/tokens").mock( return_value=Response(500, text="token") ) respx.get("/auth/check_jwt").mock(return_value=Response(200, json={})) envoy = Envoy("127.0.0.1") await envoy.setup() with pytest.raises(EnvoyAuthenticationError): await envoy.authenticate("username", "password") @pytest.mark.asyncio @respx.mock async def test_no_remote_token_with_7_6_175_standard() -> None: """Test Unable to obtain token for Envoy authentication from https://entrez.enphaseenergy.com/tokens""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version, info=True) respx.post("https://enlighten.enphaseenergy.com/login/login.json?").mock( return_value=Response( 200, json={ "session_id": "1234567890", "user_id": "1234567890", "user_name": "test", "first_name": "Test", "is_consumer": True, "manager_token": "1234567890", }, ) ) respx.post("https://entrez.enphaseenergy.com/tokens").mock( return_value=Response(500, text="token") ) respx.get("/auth/check_jwt").mock(return_value=Response(200, json={})) envoy = Envoy("127.0.0.1") await envoy.setup() with pytest.raises(EnvoyAuthenticationError): await envoy.authenticate("username", "password") @pytest.mark.asyncio @respx.mock async def test_enlighten_json_error_with_7_6_175_standard() -> None: """Test Unable to decode response from Enlighten""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version, info=True) respx.post("https://enlighten.enphaseenergy.com/login/login.json?").mock( return_value=Response( 200, text="nojson", ) ) respx.post("https://entrez.enphaseenergy.com/tokens").mock( return_value=Response(200, text="token") ) respx.get("/auth/check_jwt").mock(return_value=Response(200, json={})) envoy = Envoy("127.0.0.1") await envoy.setup() with pytest.raises(EnvoyAuthenticationError): await envoy.authenticate("username", "password") @pytest.mark.asyncio @respx.mock async def test_token_with_7_6_175_standard() -> None: """Test auth using token""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version, info=True) envoy = Envoy("127.0.0.1") await envoy.setup() token = jwt.encode( payload={"name": "envoy", "exp": 1707837780}, key="secret", algorithm="HS256" ) await envoy.authenticate("username", "password", token) assert isinstance(envoy.auth, EnvoyTokenAuth) assert envoy.auth.expire_timestamp == 1707837780 assert envoy.auth.token == token # test cookies function now cookies are not on request assert envoy.auth.cookies == {} # execute refresh code cov await envoy.auth.refresh() # cov: test force no serial error # Your firmware requires token authentication, # but no envoy serial number was provided to obtain the token used_serial = envoy.auth.envoy_serial envoy.auth.envoy_serial = None with pytest.raises(EnvoyAuthenticationError): await envoy.auth.refresh() envoy.auth.envoy_serial = used_serial # cov: test force no cloud credentials error # Your firmware requires token authentication # but no cloud credentials were provided to obtain the token envoy.auth.cloud_password = None with pytest.raises(EnvoyAuthenticationError): await envoy.auth.refresh() @pytest.mark.asyncio @respx.mock async def test_remote_login_response_with_7_6_175_standard() -> None: """Test enlighten login response for is_consumer and manager_token""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version, info=True) envoy = Envoy("127.0.0.1") await envoy.setup() await envoy.authenticate("username", "password") assert isinstance(envoy.auth, EnvoyTokenAuth) assert envoy.auth.manager_token == "1234567890" assert envoy.auth.is_consumer pyenphase-pyenphase-1bfa6dd/tests/test_ct_meters.py000066400000000000000000000556511464551303400230320ustar00rootroot00000000000000"""Test envoy metered with enabled and disabled CT""" import logging import pytest import respx from httpx import Response from pyenphase import register_updater from pyenphase.envoy import SupportedFeatures from pyenphase.models.meters import CtMeterData, CtType, EnvoyMeterData from pyenphase.models.system_consumption import EnvoySystemConsumption from pyenphase.models.system_production import EnvoySystemProduction from pyenphase.updaters.meters import EnvoyMetersUpdater from .common import ( get_mock_envoy, load_fixture, load_json_fixture, load_json_list_fixture, start_7_firmware_mock, updater_features, ) LOGGER = logging.getLogger(__name__) @pytest.mark.asyncio @respx.mock async def test_pr111_with_7_3_466_metered_disabled_cts(): """Test envoy metered with disabled ct to report from production inverters PR111.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.3.466_metered_disabled_cts" start_7_firmware_mock() respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock( return_value=Response(200, text=load_fixture(version, "production")) ) respx.get("/production.json").mock( return_value=Response(200, text=load_fixture(version, "production.json")) ) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) respx.get("/admin/lib/tariff").mock(return_value=Response(404)) respx.get("/ivp/ss/gen_config").mock(return_value=Response(200, json={})) respx.get("/ivp/meters").mock( return_value=Response(200, text=load_fixture(version, "ivp_meters")) ) envoy = await get_mock_envoy() data = envoy.data assert data is not None assert not (envoy._supported_features & SupportedFeatures.TOTAL_CONSUMPTION) assert not (envoy._supported_features & SupportedFeatures.NET_CONSUMPTION) assert envoy._supported_features & SupportedFeatures.PRODUCTION assert envoy._supported_features & SupportedFeatures.INVERTERS assert envoy._supported_features & SupportedFeatures.PRODUCTION assert updater_features(envoy._updaters) == { "EnvoyProductionJsonFallbackUpdater": SupportedFeatures.PRODUCTION, "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, } assert envoy.part_number == "800-00654-r08" assert not data.system_consumption assert data.system_production.watts_now == 751 assert data.system_production.watt_hours_today == 4425 assert data.system_production.watt_hours_last_7_days == 111093 assert data.system_production.watt_hours_lifetime == 702919 @pytest.mark.asyncio @respx.mock async def test_pr111_with_7_6_175_with_cts(): """Test envoy metered with ct to report from production eim PR111.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_with_cts" start_7_firmware_mock() respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock( return_value=Response(200, text=load_fixture(version, "production")) ) respx.get("/production.json").mock( return_value=Response(200, text=load_fixture(version, "production.json")) ) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) respx.get("/admin/lib/tariff").mock(return_value=Response(404)) respx.get("/ivp/ss/gen_config").mock(return_value=Response(200, json={})) respx.get("/ivp/meters").mock( return_value=Response(200, text=load_fixture(version, "ivp_meters")) ) respx.get("/ivp/meters/readings").mock( return_value=Response(200, text=load_fixture(version, "ivp_meters_readings")) ) envoy = await get_mock_envoy() data = envoy.data assert data is not None assert envoy._supported_features & SupportedFeatures.TOTAL_CONSUMPTION assert envoy._supported_features & SupportedFeatures.NET_CONSUMPTION assert envoy._supported_features & SupportedFeatures.PRODUCTION assert envoy._supported_features & SupportedFeatures.INVERTERS assert envoy._supported_features & SupportedFeatures.METERING assert envoy._supported_features & SupportedFeatures.INVERTERS assert envoy._supported_features & SupportedFeatures.CTMETERS assert updater_features(envoy._updaters) == { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyProductionJsonUpdater": SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION, "EnvoyMetersUpdater": SupportedFeatures.CTMETERS, } assert envoy.part_number == "800-00654-r08" assert data.system_consumption assert data.system_production.watts_now == 488 assert data.system_production.watt_hours_today == 4425 assert data.system_production.watt_hours_last_7_days == 111093 assert data.system_production.watt_hours_lifetime == 3183793 assert ( envoy.envoy_model == "Envoy, phases: 1, phase mode: three, net-consumption CT, production CT" ) @pytest.mark.asyncio @respx.mock async def test_pr111_with_7_6_175_standard(): """Test envoy metered with ct to report from production eim PR111.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock( return_value=Response(200, text=load_fixture(version, "production")) ) respx.get("/production.json").mock( return_value=Response(200, text=load_fixture(version, "production.json")) ) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) respx.get("/ivp/ss/gen_config").mock(return_value=Response(200, json={})) respx.get("/admin/lib/tariff").mock(return_value=Response(404)) respx.get("/ivp/meters").mock(return_value=Response(200, text="")) envoy = await get_mock_envoy() data = envoy.data assert data is not None assert not (envoy._supported_features & SupportedFeatures.TOTAL_CONSUMPTION) assert not (envoy._supported_features & SupportedFeatures.NET_CONSUMPTION) assert envoy._supported_features & SupportedFeatures.PRODUCTION assert envoy._supported_features & SupportedFeatures.INVERTERS assert updater_features(envoy._updaters) == { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyApiV1ProductionUpdater": SupportedFeatures.PRODUCTION, } assert envoy.part_number == "800-00656-r06" assert not data.system_consumption assert data.system_production.watts_now == 5740 assert data.system_production.watt_hours_today == 36462 assert data.system_production.watt_hours_last_7_days == 189712 assert data.system_production.watt_hours_lifetime == 6139406 assert envoy.envoy_model == "Envoy" @pytest.mark.asyncio @respx.mock async def test_ct_data_structures_with_7_3_466_with_cts_3phase(): """Test meters model using envoy metered CT with multiple phases""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) # start with regular data first version = "7.3.466_with_cts_3phase" start_7_firmware_mock() respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock( return_value=Response(200, text=load_fixture(version, "production")) ) respx.get("/production.json").mock( return_value=Response(200, text=load_fixture(version, "production.json")) ) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) respx.get("/ivp/ss/gen_config").mock(return_value=Response(200, json={})) respx.get("/admin/lib/tariff").mock(return_value=Response(404)) respx.get("/ivp/meters").mock( return_value=Response(200, text=load_fixture(version, "ivp_meters")) ) respx.get("/ivp/meters/readings").mock( return_value=Response(200, text=load_fixture(version, "ivp_meters_readings")) ) # details of this test is done elsewhere already, just check data is returned envoy = await get_mock_envoy() data = envoy.data assert data is not None # Test prior similar updater active remove_2nd_metersupdater = register_updater(EnvoyMetersUpdater) await envoy.probe() remove_2nd_metersupdater # load mock data for meters and their readings meters_status = load_json_list_fixture(version, "ivp_meters") meters_readings = load_json_list_fixture(version, "ivp_meters_readings") meter_status: CtMeterData = { "eid": meters_status[0]["eid"], "state": meters_status[0]["state"], "measurementType": meters_status[0]["measurementType"], "phaseMode": meters_status[0]["phaseMode"], "phaseCount": meters_status[0]["phaseCount"], "meteringStatus": meters_status[0]["meteringStatus"], "statusFlags": meters_status[0]["statusFlags"], } # test meters.from_api method ct_data: EnvoyMeterData = EnvoyMeterData.from_api( meters_readings[0], meter_status, ) assert ct_data.eid == 704643328 assert ct_data.measurement_type == "production" # test meters.from_phase method ct_phase_data: EnvoyMeterData | None = EnvoyMeterData.from_phase( meters_readings[0], meter_status, 0 ) assert ct_phase_data is not None assert ct_phase_data.eid == 1778385169 assert ct_phase_data.measurement_type == "production" assert ct_phase_data.energy_delivered == 3183794 assert ( envoy.envoy_model == "Envoy, phases: 3, phase mode: three, net-consumption CT, production CT" ) # test exception handling by specifying non-existing phase ct_no_phase_data = EnvoyMeterData.from_phase(meters_readings[0], meter_status, 3) assert ct_no_phase_data is None # test exception handling for missing phase data, remove phase data from mock data del meters_readings[0]["channels"] ct_no_phase_data = EnvoyMeterData.from_phase(meters_readings[0], meter_status, 0) assert ct_no_phase_data is None # test exception handling for phase data in production using wrong phase production_data = data.raw["/production.json?details=1"] production_no_phase_data = EnvoySystemProduction.from_production_phase( production_data, 3 ) assert production_no_phase_data is None # test exception handling for phase data if key is missing del production_data["production"][1]["type"] try: production_no_phase_data = EnvoySystemProduction.from_production_phase( production_data, 0 ) except ValueError: production_no_phase_data = None assert production_no_phase_data is None # test exception handling for phase data in consumption using wrong phase consumption_data = data.raw["/production.json?details=1"] consumption_no_phase_data = EnvoySystemConsumption.from_production_phase( consumption_data, 3 ) assert consumption_no_phase_data is None # test handling missing phases when expected in ct readings meters_status = load_json_list_fixture(version, "ivp_meters") meters_readings = load_json_list_fixture(version, "ivp_meters_readings") # remove phase data from CT readings del meters_readings[0]["channels"] del meters_readings[1]["channels"] respx.get("/ivp/meters").mock(return_value=Response(200, json=meters_status)) respx.get("/ivp/meters/readings").mock( return_value=Response(200, json=meters_readings) ) await envoy.update() assert envoy.data.ctmeter_production_phases is None assert envoy.data.ctmeter_consumption_phases is None @pytest.mark.asyncio @respx.mock async def test_ct_data_structures_with_7_6_175_with_cts_3phase(): """Test meters model using envoy metered CT with multiple phases""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) # start with regular data first version = "7.6.175_with_cts_3phase" start_7_firmware_mock() respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock( return_value=Response(200, text=load_fixture(version, "production")) ) respx.get("/production.json").mock( return_value=Response(200, text=load_fixture(version, "production.json")) ) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) respx.get("/admin/lib/tariff").mock(return_value=Response(404)) respx.get("/ivp/meters").mock( return_value=Response(200, text=load_fixture(version, "ivp_meters")) ) respx.get("/ivp/meters/readings").mock( return_value=Response(200, text=load_fixture(version, "ivp_meters_readings")) ) # details of this test is done elsewhere already, just check data is returned envoy = await get_mock_envoy() data = envoy.data assert data is not None # Test prior similar updater active remove_2nd_metersupdater = register_updater(EnvoyMetersUpdater) await envoy.probe() remove_2nd_metersupdater # load mock data for meters and their readings meters_status = load_json_list_fixture(version, "ivp_meters") meters_readings = load_json_list_fixture(version, "ivp_meters_readings") meter_status: CtMeterData = { "eid": meters_status[0]["eid"], "state": meters_status[0]["state"], "measurementType": meters_status[0]["measurementType"], "phaseMode": meters_status[0]["phaseMode"], "phaseCount": meters_status[0]["phaseCount"], "meteringStatus": meters_status[0]["meteringStatus"], "statusFlags": meters_status[0]["statusFlags"], } # test meters.from_api method ct_data: EnvoyMeterData = EnvoyMeterData.from_api( meters_readings[0], meter_status, ) assert ct_data.eid == 704643328 assert ct_data.measurement_type == "production" # test meters.from_phase method ct_phase_data: EnvoyMeterData | None = EnvoyMeterData.from_phase( meters_readings[0], meter_status, 0 ) assert ct_phase_data is not None assert ct_phase_data.eid == 1778385169 assert ct_phase_data.measurement_type == "production" assert ct_phase_data.energy_delivered == 3183794 assert ( envoy.envoy_model == "Envoy, phases: 3, phase mode: three, net-consumption CT, production CT" ) # test exception handling by specifying non-existing phase ct_no_phase_data = EnvoyMeterData.from_phase(meters_readings[0], meter_status, 3) assert ct_no_phase_data is None # test exception handling for missing phase data, remove phase data from mock data del meters_readings[0]["channels"] ct_no_phase_data = EnvoyMeterData.from_phase(meters_readings[0], meter_status, 0) assert ct_no_phase_data is None # test exception handling for phase data if key is missing production_data = data.raw["/production.json?details=1"] del production_data["production"][1]["type"] with pytest.raises(ValueError): EnvoySystemProduction.from_production_phase(production_data, 0) @pytest.mark.asyncio @respx.mock async def test_ct_data_structures_with_7_6_175_with_total_cts_3phase(): """Test meters model using envoy metered total-consumption CT with multiple phases""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) # start with regular data first version = "7.6.175_with_cts_3phase" start_7_firmware_mock() respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) # remove production segment from production for COV test production_json = load_json_fixture(version, "production") del production_json["production"] respx.get("/production").mock(return_value=Response(200, json=production_json)) production_json = load_json_fixture(version, "production.json") del production_json["production"] respx.get("/production.json").mock(return_value=Response(200, json=production_json)) production_json = load_json_fixture(version, "production.json") del production_json["production"] respx.get("/production.json?details=1").mock( return_value=Response(200, json=production_json) ) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) respx.get("/admin/lib/tariff").mock(return_value=Response(404)) # Force ct consumption meter to total consumption for COV ivp_Meters = load_fixture(version, "ivp_meters").replace( CtType.NET_CONSUMPTION, CtType.TOTAL_CONSUMPTION ) respx.get("/ivp/meters").mock(return_value=Response(200, text=ivp_Meters)) respx.get("/ivp/meters/readings").mock( return_value=Response(200, text=load_fixture(version, "ivp_meters_readings")) ) # details of this test is done elsewhere already, just check data is returned envoy = await get_mock_envoy() data = envoy.data assert data is not None assert ( envoy.envoy_model == "Envoy, phases: 3, phase mode: three, total-consumption CT, production CT" ) @pytest.mark.asyncio @respx.mock async def test_ct_storage_with_8_2_127_with_3cts_and_battery_split(): """Test meters model using envoy metered CT with multiple phases""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) # start with regular data first version = "8.2.127_with_3cts_and_battery_split" start_7_firmware_mock() respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock( return_value=Response(200, text=load_fixture(version, "production")) ) respx.get("/production.json").mock( return_value=Response(200, text=load_fixture(version, "production.json")) ) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) respx.get("/ivp/ss/gen_config").mock(return_value=Response(200, json={})) respx.get("/admin/lib/tariff").mock(return_value=Response(404)) respx.get("/ivp/meters").mock( return_value=Response(200, text=load_fixture(version, "ivp_meters")) ) respx.get("/ivp/meters/readings").mock( return_value=Response(200, text=load_fixture(version, "ivp_meters_readings")) ) # details of this test is done elsewhere already, just check data is returned envoy = await get_mock_envoy() data = envoy.data assert data is not None # load mock data for meters and their readings meters_status = load_json_list_fixture(version, "ivp_meters") meters_readings = load_json_list_fixture(version, "ivp_meters_readings") meter_status: CtMeterData = { "eid": meters_status[2]["eid"], "state": meters_status[2]["state"], "measurementType": meters_status[2]["measurementType"], "phaseMode": meters_status[2]["phaseMode"], "phaseCount": meters_status[2]["phaseCount"], "meteringStatus": meters_status[2]["meteringStatus"], "statusFlags": meters_status[2]["statusFlags"], } # test meters.from_api method ct_data: EnvoyMeterData = EnvoyMeterData.from_api( meters_readings[2], meter_status, ) assert ct_data.eid == 704643840 assert ct_data.measurement_type == "storage" # test meters.from_phase method ct_phase_data: EnvoyMeterData | None = EnvoyMeterData.from_phase( meters_readings[2], meter_status, 0 ) assert ct_phase_data is not None assert ct_phase_data.eid == 1778385681 assert ct_phase_data.measurement_type == "storage" assert ct_phase_data.energy_delivered == 1136860 assert ( envoy.envoy_model == "Envoy, phases: 2, phase mode: split, net-consumption CT, production CT, storage CT" ) # test exception handling by specifying non-existing phase ct_no_phase_data = EnvoyMeterData.from_phase(meters_readings[2], meter_status, 3) assert ct_no_phase_data is None # test exception handling for missing phase data, remove phase data from mock data del meters_readings[2]["channels"] ct_no_phase_data = EnvoyMeterData.from_phase(meters_readings[2], meter_status, 0) assert ct_no_phase_data is None respx.get("/ivp/meters").mock(return_value=Response(200, json=meters_status)) respx.get("/ivp/meters/readings").mock( return_value=Response(200, json=meters_readings) ) await envoy.update() assert envoy.data.ctmeter_storage_phases is None pyenphase-pyenphase-1bfa6dd/tests/test_endpoints.py000066400000000000000000001626141464551303400230460ustar00rootroot00000000000000"""Test endpoint for envoy v7 and newer firmware""" import json import logging from dataclasses import replace from os import listdir from os.path import isfile, join from typing import Any import orjson import pytest import respx from httpx import Response from syrupy.assertion import SnapshotAssertion from pyenphase.const import URL_GRID_RELAY, URL_TARIFF, PhaseNames from pyenphase.envoy import EnvoyProbeFailed, SupportedFeatures from pyenphase.exceptions import EnvoyFeatureNotAvailable from pyenphase.models.dry_contacts import DryContactStatus from pyenphase.models.meters import CtMeterStatus, CtType, EnvoyPhaseMode from pyenphase.models.tariff import EnvoyStorageMode from .common import ( get_mock_envoy, load_fixture, load_json_fixture, start_7_firmware_mock, updater_features, ) LOGGER = logging.getLogger(__name__) @pytest.mark.parametrize( ( "version", "part_number", "supported_features", "updaters", "phase_count", "common_properties", "production_phases", "consumption_phases", "ct_production", "ct_consumption", "ct_storage", "ct_production_phases", "ct_consumption_phases", "ct_storage_phases", ), [ ( "5.0.62", "800-00551-r02", SupportedFeatures.INVERTERS | SupportedFeatures.PRODUCTION | SupportedFeatures.TARIFF, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyApiV1ProductionUpdater": SupportedFeatures.PRODUCTION, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, }, 1, { "ctMeters": 0, "phaseCount": 1, "phaseMode": None, "consumptionMeter": None, "productionMeter": None, "storageMeter": None, }, {}, {}, {}, {}, {}, {}, {}, {}, ), ( "4.10.35", "800-00555-r03", SupportedFeatures.METERING | SupportedFeatures.INVERTERS | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION | SupportedFeatures.TARIFF | SupportedFeatures.DUALPHASE | SupportedFeatures.CTMETERS, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyProductionJsonUpdater": SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, "EnvoyMetersUpdater": SupportedFeatures.DUALPHASE | SupportedFeatures.CTMETERS, }, 2, { "ctMeters": 2, "phaseCount": 2, "phaseMode": EnvoyPhaseMode.SPLIT, "consumptionMeter": CtType.NET_CONSUMPTION, "productionMeter": CtType.PRODUCTION, "storageMeter": None, }, {}, {}, { "eid": 704643328, "active_power": 166, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, { "eid": 704643584, "active_power": 567, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, {}, { PhaseNames.PHASE_1: { "eid": 1778385169, "active_power": 83, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385170, "active_power": 84, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, }, { PhaseNames.PHASE_1: { "eid": 1778385425, "active_power": 394, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385426, "active_power": 173, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, }, {}, ), ( "7.3.130", "800-00555-r03", SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.INVERTERS | SupportedFeatures.PRODUCTION, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyProductionJsonUpdater": SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION, }, 1, { "ctMeters": 0, "phaseCount": 1, "phaseMode": None, "consumptionMeter": None, "productionMeter": None, "storageMeter": None, }, {}, {}, {}, {}, {}, {}, {}, {}, ), ( "7.3.130_no_consumption", "800-00647-r10", SupportedFeatures.METERING | SupportedFeatures.INVERTERS | SupportedFeatures.PRODUCTION | SupportedFeatures.TARIFF | SupportedFeatures.DUALPHASE | SupportedFeatures.CTMETERS, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyProductionJsonUpdater": SupportedFeatures.METERING | SupportedFeatures.PRODUCTION, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, "EnvoyMetersUpdater": SupportedFeatures.DUALPHASE | SupportedFeatures.CTMETERS, }, 2, { "ctMeters": 1, "phaseCount": 2, "phaseMode": EnvoyPhaseMode.SPLIT, "consumptionMeter": None, "productionMeter": CtType.PRODUCTION, "storageMeter": None, }, {}, {}, { "eid": 704643328, "active_power": 3625, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, {}, {}, { PhaseNames.PHASE_1: { "eid": 1778385169, "active_power": 1811, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385170, "active_power": 1814, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, }, {}, {}, ), ( "7.3.517", "800-00555-r03", SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.ENPOWER | SupportedFeatures.ENCHARGE | SupportedFeatures.INVERTERS | SupportedFeatures.PRODUCTION | SupportedFeatures.TARIFF, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyProductionJsonUpdater": SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION, "EnvoyEnembleUpdater": SupportedFeatures.ENPOWER | SupportedFeatures.ENCHARGE, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, }, 1, { "ctMeters": 0, "phaseCount": 1, "phaseMode": None, "consumptionMeter": None, "productionMeter": None, "storageMeter": None, }, {}, {}, {}, {}, {}, {}, {}, {}, ), ( "7.3.517_legacy_savings_mode", "800-00555-r03", SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.ENPOWER | SupportedFeatures.ENCHARGE | SupportedFeatures.INVERTERS | SupportedFeatures.PRODUCTION | SupportedFeatures.TARIFF, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyProductionJsonUpdater": SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION, "EnvoyEnembleUpdater": SupportedFeatures.ENPOWER | SupportedFeatures.ENCHARGE, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, }, 1, { "ctMeters": 0, "phaseCount": 1, "phaseMode": None, "consumptionMeter": None, "productionMeter": None, "storageMeter": None, }, {}, {}, {}, {}, {}, {}, {}, {}, ), ( "7.3.517_system_2", "800-00555-r03", SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.ENPOWER | SupportedFeatures.ENCHARGE | SupportedFeatures.INVERTERS | SupportedFeatures.PRODUCTION | SupportedFeatures.TARIFF | SupportedFeatures.DUALPHASE | SupportedFeatures.CTMETERS, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyProductionJsonUpdater": SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION, "EnvoyEnembleUpdater": SupportedFeatures.ENPOWER | SupportedFeatures.ENCHARGE, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, "EnvoyMetersUpdater": SupportedFeatures.DUALPHASE | SupportedFeatures.CTMETERS, }, 2, { "ctMeters": 2, "phaseCount": 2, "phaseMode": EnvoyPhaseMode.SPLIT, "consumptionMeter": CtType.NET_CONSUMPTION, "productionMeter": CtType.PRODUCTION, "storageMeter": None, }, {}, {}, { "eid": 704643328, "active_power": 2660, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, { "eid": 704643584, "active_power": 23, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, {}, { PhaseNames.PHASE_1: { "eid": 1778385169, "active_power": 1331, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385170, "active_power": 1329, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, }, { PhaseNames.PHASE_1: { "eid": 1778385425, "active_power": -17, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385426, "active_power": 41, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, }, {}, ), ( "7.3.466_metered_disabled_cts", "800-00654-r08", SupportedFeatures.INVERTERS | SupportedFeatures.PRODUCTION | SupportedFeatures.TARIFF, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyProductionJsonFallbackUpdater": SupportedFeatures.PRODUCTION, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, }, 1, { "ctMeters": 0, "phaseCount": 1, "phaseMode": None, "consumptionMeter": None, "productionMeter": None, "storageMeter": None, }, {}, {}, {}, {}, {}, {}, {}, {}, ), ( "7.6.114_without_cts", "800-00656-r06", SupportedFeatures.INVERTERS | SupportedFeatures.PRODUCTION, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyApiV1ProductionUpdater": SupportedFeatures.PRODUCTION, }, 1, { "ctMeters": 0, "phaseCount": 1, "phaseMode": None, "consumptionMeter": None, "productionMeter": None, "storageMeter": None, }, {}, {}, {}, {}, {}, {}, {}, {}, ), ( "7.6.175", "800-00555-r03", SupportedFeatures.INVERTERS | SupportedFeatures.PRODUCTION, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyApiV1ProductionUpdater": SupportedFeatures.PRODUCTION, }, 1, { "ctMeters": 0, "phaseCount": 1, "phaseMode": None, "consumptionMeter": None, "productionMeter": None, "storageMeter": None, }, {}, {}, {}, {}, {}, {}, {}, {}, ), ( "7.6.175_total", "800-00654-r06", SupportedFeatures.INVERTERS | SupportedFeatures.PRODUCTION | SupportedFeatures.TARIFF, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyProductionJsonFallbackUpdater": SupportedFeatures.PRODUCTION, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, }, 1, { "ctMeters": 0, "phaseCount": 1, "phaseMode": None, "consumptionMeter": None, "productionMeter": None, "storageMeter": None, }, {}, {}, {}, {}, {}, {}, {}, {}, ), ( "7.6.175_standard", "800-00656-r06", SupportedFeatures.INVERTERS | SupportedFeatures.PRODUCTION, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyApiV1ProductionUpdater": SupportedFeatures.PRODUCTION, }, 1, { "ctMeters": 0, "phaseCount": 1, "phaseMode": None, "consumptionMeter": None, "productionMeter": None, "storageMeter": None, }, {}, {}, {}, {}, {}, {}, {}, {}, ), ( "7.6.175_with_cts", "800-00654-r08", SupportedFeatures.INVERTERS | SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION | SupportedFeatures.TARIFF | SupportedFeatures.CTMETERS, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyProductionJsonUpdater": SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, "EnvoyMetersUpdater": SupportedFeatures.CTMETERS, }, 1, { "ctMeters": 2, "phaseCount": 1, "phaseMode": EnvoyPhaseMode.THREE, "consumptionMeter": CtType.NET_CONSUMPTION, "productionMeter": CtType.PRODUCTION, "storageMeter": None, }, {}, {}, {}, {}, {}, {}, {}, {}, ), ( "7.6.175_with_cts_3phase", "800-00654-r08", SupportedFeatures.INVERTERS | SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION | SupportedFeatures.TARIFF | SupportedFeatures.THREEPHASE | SupportedFeatures.CTMETERS, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyProductionJsonUpdater": SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, "EnvoyMetersUpdater": SupportedFeatures.THREEPHASE | SupportedFeatures.CTMETERS, }, 3, { "ctMeters": 2, "phaseCount": 3, "phaseMode": EnvoyPhaseMode.THREE, "consumptionMeter": CtType.NET_CONSUMPTION, "productionMeter": CtType.PRODUCTION, "storageMeter": None, }, { PhaseNames.PHASE_1: { "watt_hours_lifetime": 1869678, "watt_hours_last_7_days": 29891, "watt_hours_today": 2200, "watts_now": -3, }, PhaseNames.PHASE_2: { "watt_hours_lifetime": 1241246, "watt_hours_last_7_days": 19794, "watt_hours_today": 1455, "watts_now": 0, }, PhaseNames.PHASE_3: { "watt_hours_lifetime": 1240189, "watt_hours_last_7_days": 19807, "watt_hours_today": 1458, "watts_now": -4, }, }, { PhaseNames.PHASE_1: { "watt_hours_lifetime": 2293783, "watt_hours_last_7_days": 39392, "watt_hours_today": 8585, "watts_now": 89, }, PhaseNames.PHASE_2: { "watt_hours_lifetime": 948058, "watt_hours_last_7_days": 18949, "watt_hours_today": 2155, "watts_now": 123, }, PhaseNames.PHASE_3: { "watt_hours_lifetime": 832954, "watt_hours_last_7_days": 10443, "watt_hours_today": 1683, "watts_now": -3, }, }, { "eid": 704643328, "active_power": 489, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, { "eid": 704643584, "active_power": -36, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, {}, { PhaseNames.PHASE_1: { "eid": 1778385169, "active_power": 489, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385170, "active_power": 0, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_3: { "eid": 1778385171, "active_power": -1, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, }, { PhaseNames.PHASE_1: { "eid": 1778385425, "active_power": -36, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385426, "active_power": -0, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_3: { "eid": 1778385427, "active_power": -0, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, }, {}, ), ( "7.3.466_with_cts_3phase", "800-00654-r08", SupportedFeatures.INVERTERS | SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION | SupportedFeatures.TARIFF | SupportedFeatures.THREEPHASE | SupportedFeatures.CTMETERS, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyProductionJsonUpdater": SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, "EnvoyMetersUpdater": SupportedFeatures.THREEPHASE | SupportedFeatures.CTMETERS, }, 3, { "ctMeters": 2, "phaseCount": 3, "phaseMode": EnvoyPhaseMode.THREE, "consumptionMeter": CtType.NET_CONSUMPTION, "productionMeter": CtType.PRODUCTION, "storageMeter": None, }, { PhaseNames.PHASE_1: { "watt_hours_lifetime": 1869678, "watt_hours_last_7_days": 29891, "watt_hours_today": 2200, "watts_now": -3, }, PhaseNames.PHASE_2: { "watt_hours_lifetime": 1241246, "watt_hours_last_7_days": 19794, "watt_hours_today": 1455, "watts_now": 0, }, PhaseNames.PHASE_3: { "watt_hours_lifetime": 1240189, "watt_hours_last_7_days": 19807, "watt_hours_today": 1458, "watts_now": -4, }, }, { PhaseNames.PHASE_1: { "watt_hours_lifetime": 2293783, "watt_hours_last_7_days": 39392, "watt_hours_today": 8585, "watts_now": 89, }, PhaseNames.PHASE_2: { "watt_hours_lifetime": 948058, "watt_hours_last_7_days": 18949, "watt_hours_today": 2155, "watts_now": 123, }, PhaseNames.PHASE_3: { "watt_hours_lifetime": 832954, "watt_hours_last_7_days": 10443, "watt_hours_today": 1683, "watts_now": -3, }, }, { "eid": 704643328, "active_power": 489, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, { "eid": 704643584, "active_power": -36, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, {}, { PhaseNames.PHASE_1: { "eid": 1778385169, "active_power": 489, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385170, "active_power": 0, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_3: { "eid": 1778385171, "active_power": -1, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, }, { PhaseNames.PHASE_1: { "eid": 1778385425, "active_power": -36, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385426, "active_power": -0, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_3: { "eid": 1778385427, "active_power": -0, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, }, {}, ), ( "7.6.185_with_cts_and_battery_3t", "800-00654-r08", SupportedFeatures.INVERTERS | SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION | SupportedFeatures.ENCHARGE | SupportedFeatures.TARIFF | SupportedFeatures.CTMETERS, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyEnembleUpdater": SupportedFeatures.ENCHARGE, "EnvoyProductionJsonUpdater": SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, "EnvoyMetersUpdater": SupportedFeatures.CTMETERS, }, 1, { "ctMeters": 2, "phaseCount": 1, "phaseMode": EnvoyPhaseMode.THREE, "consumptionMeter": CtType.NET_CONSUMPTION, "productionMeter": CtType.PRODUCTION, "storageMeter": None, }, {}, {}, {}, {}, {}, {}, {}, {}, ), ( "8.1.41", "800-00664-r05", SupportedFeatures.INVERTERS | SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.ENCHARGE | SupportedFeatures.ENPOWER | SupportedFeatures.PRODUCTION, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyEnembleUpdater": SupportedFeatures.ENPOWER | SupportedFeatures.ENCHARGE, "EnvoyProductionJsonUpdater": SupportedFeatures.PRODUCTION | SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION, }, 1, { "ctMeters": 0, "phaseCount": 1, "phaseMode": None, "consumptionMeter": None, "productionMeter": None, "storageMeter": None, }, {}, {}, {}, {}, {}, {}, {}, {}, ), ( "8.2.127_with_3cts_and_battery_split", "800-00654-r08", SupportedFeatures.INVERTERS | SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION | SupportedFeatures.ENCHARGE | SupportedFeatures.ENPOWER | SupportedFeatures.TARIFF | SupportedFeatures.DUALPHASE | SupportedFeatures.CTMETERS, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyEnembleUpdater": SupportedFeatures.ENCHARGE | SupportedFeatures.ENPOWER, "EnvoyProductionJsonUpdater": SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, "EnvoyMetersUpdater": SupportedFeatures.DUALPHASE | SupportedFeatures.CTMETERS, }, 2, { "ctMeters": 3, "phaseCount": 2, "phaseMode": EnvoyPhaseMode.SPLIT, "consumptionMeter": CtType.NET_CONSUMPTION, "productionMeter": CtType.PRODUCTION, "storageMeter": CtType.STORAGE, }, {}, {}, { "eid": 704643328, "active_power": 1714, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, { "eid": 704643584, "active_power": 129, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, { "eid": 704643840, "active_power": -2580, "measurement_type": CtType.STORAGE, "metering_status": CtMeterStatus.NORMAL, }, { PhaseNames.PHASE_1: { "eid": 1778385169, "active_power": 856, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385170, "active_power": 858, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, }, { PhaseNames.PHASE_1: { "eid": 1778385425, "active_power": -201, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385426, "active_power": 331, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, }, { PhaseNames.PHASE_1: { "eid": 1778385681, "active_power": -2115, "measurement_type": CtType.STORAGE, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385682, "active_power": -465, "measurement_type": CtType.STORAGE, "metering_status": CtMeterStatus.NORMAL, }, }, ), ( "8.2.127_with_generator_running", "800-00647-r09", SupportedFeatures.INVERTERS | SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION | SupportedFeatures.ENCHARGE | SupportedFeatures.ENPOWER | SupportedFeatures.TARIFF | SupportedFeatures.DUALPHASE | SupportedFeatures.CTMETERS | SupportedFeatures.GENERATOR, { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyEnembleUpdater": SupportedFeatures.ENCHARGE | SupportedFeatures.ENPOWER, "EnvoyProductionJsonUpdater": SupportedFeatures.METERING | SupportedFeatures.TOTAL_CONSUMPTION | SupportedFeatures.NET_CONSUMPTION | SupportedFeatures.PRODUCTION, "EnvoyTariffUpdater": SupportedFeatures.TARIFF, "EnvoyMetersUpdater": SupportedFeatures.DUALPHASE | SupportedFeatures.CTMETERS, "EnvoyGeneratorUpdater": SupportedFeatures.GENERATOR, }, 2, { "ctMeters": 2, "phaseCount": 2, "phaseMode": EnvoyPhaseMode.SPLIT, "consumptionMeter": CtType.NET_CONSUMPTION, "productionMeter": CtType.PRODUCTION, "storageMeter": None, }, {}, {}, { "eid": 704643328, "active_power": 2336, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, { "eid": 704643584, "active_power": 196, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, {}, { PhaseNames.PHASE_1: { "eid": 1778385169, "active_power": 1173, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385170, "active_power": 1163, "measurement_type": CtType.PRODUCTION, "metering_status": CtMeterStatus.NORMAL, }, }, { PhaseNames.PHASE_1: { "eid": 1778385425, "active_power": 268, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, PhaseNames.PHASE_2: { "eid": 1778385426, "active_power": -72, "measurement_type": CtType.NET_CONSUMPTION, "metering_status": CtMeterStatus.NORMAL, }, }, {}, ), ], ids=[ "5.0.62", "4.10.35", "7.3.130", "7.3.130_no_consumption", "7.3.517", "7.3.517_legacy_savings_mode", "7.3.517_system_2", "7.3.466_metered_disabled_cts", "7.6.114_without_cts", "7.6.175", "7.6.175_total", "7.6.175_standard", "7.6.175_with_cts", "7.6.175_with_cts_3phase", "7.3.466_with_cts_3phase", "7.6.185_with_cts_and_battery_3t", "8.1.41", "8.2.127_with_3cts_and_battery_split", "8.2.127_with_generator_running", ], ) @pytest.mark.asyncio @respx.mock async def test_with_7_x_firmware( version: str, part_number: str, snapshot: SnapshotAssertion, supported_features: SupportedFeatures, updaters: dict[str, SupportedFeatures], caplog: pytest.LogCaptureFixture, phase_count: int, common_properties: dict[str, Any], production_phases: dict[str, dict[str, Any]], consumption_phases: dict[str, dict[str, Any]], ct_production: dict[str, Any], ct_consumption: dict[str, Any], ct_storage: dict[str, Any], ct_production_phases: dict[str, dict[str, Any]], ct_consumption_phases: dict[str, dict[str, Any]], ct_storage_phases: dict[str, dict[str, Any]], ) -> None: """Verify with 7.x firmware.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) start_7_firmware_mock() path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) if "production" in files: try: json_data = load_json_fixture(version, "production") except json.decoder.JSONDecodeError: json_data = None respx.get("/production").mock(return_value=Response(200, json=json_data)) else: respx.get("/production").mock(return_value=Response(404)) if "production.json" in files: respx.get("/production.json").mock( return_value=Response( 200, json=load_json_fixture(version, "production.json") ) ) respx.get("/production.json?details=1").mock( return_value=Response( 200, json=load_json_fixture(version, "production.json") ) ) else: respx.get("/production.json").mock(return_value=Response(404)) respx.get("/production.json?details=1").mock(return_value=Response(404)) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock( return_value=Response( 200, json=load_json_fixture(version, "ivp_ensemble_inventory") ) ) if "ivp_ensemble_dry_contacts" in files: try: json_data = load_json_fixture(version, "ivp_ensemble_dry_contacts") except json.decoder.JSONDecodeError: json_data = None respx.get("/ivp/ensemble/dry_contacts").mock( return_value=Response(200, json=json_data) ) respx.post("/ivp/ensemble/dry_contacts").mock( return_value=Response(200, json=json_data) ) if "ivp_ss_dry_contact_settings" in files: try: json_data = load_json_fixture(version, "ivp_ss_dry_contact_settings") except json.decoder.JSONDecodeError: json_data = None respx.get("/ivp/ss/dry_contact_settings").mock( return_value=Response(200, json=json_data) ) respx.post("/ivp/ss/dry_contact_settings").mock( return_value=Response(200, json=json_data) ) if "ivp_ensemble_power" in files: try: json_data = load_json_fixture(version, "ivp_ensemble_power") except json.decoder.JSONDecodeError: json_data = None respx.get("/ivp/ensemble/power").mock( return_value=Response(200, json=json_data) ) if "ivp_ensemble_secctrl" in files: try: json_data = load_json_fixture(version, "ivp_ensemble_secctrl") except json.decoder.JSONDecodeError: json_data = None respx.get("/ivp/ensemble/secctrl").mock( return_value=Response(200, json=json_data) ) if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) respx.put("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(404)) if "ivp_meters" in files: respx.get("/ivp/meters").mock( return_value=Response(200, json=load_json_fixture(version, "ivp_meters")) ) else: respx.get("/ivp/meters").mock(return_value=Response(404)) if "ivp_meters_readings" in files: respx.get("/ivp/meters/readings").mock( return_value=Response( 200, json=load_json_fixture(version, "ivp_meters_readings") ) ) else: respx.get("/ivp/meters/readings").mock(return_value=Response(404)) if "ivp_ss_gen_config" in files: try: json_data = load_json_fixture(version, "ivp_ss_gen_config") except json.decoder.JSONDecodeError: json_data = {} respx.get("/ivp/ss/gen_config").mock(return_value=Response(200, json=json_data)) else: respx.get("/ivp/ss/gen_config").mock(return_value=Response(200, json={})) caplog.set_level(logging.DEBUG) envoy = await get_mock_envoy() data = envoy.data assert data == snapshot assert envoy.firmware == version.split("_")[0] assert envoy.serial_number assert envoy.part_number == part_number assert updater_features(envoy._updaters) == updaters # We're testing, disable warning on private member # pylint: disable=protected-access assert envoy._supported_features == supported_features if supported_features & supported_features.ENPOWER: # switch off debug for one post to improve COV logging.getLogger("pyenphase").setLevel(logging.WARN) respx.post(URL_GRID_RELAY).mock(return_value=Response(200, json={})) await envoy.go_on_grid() logging.getLogger("pyenphase").setLevel(logging.DEBUG) assert respx.calls.last.request.content == orjson.dumps( {"mains_admin_state": "closed"} ) await envoy.go_off_grid() assert respx.calls.last.request.content == orjson.dumps( {"mains_admin_state": "open"} ) # Test updating dry contacts with pytest.raises(ValueError): await envoy.update_dry_contact({"missing": "id"}) with pytest.raises(ValueError): bad_envoy = await get_mock_envoy(False) await bad_envoy.probe() await bad_envoy.update_dry_contact({"id": "NC1"}) dry_contact = envoy.data.dry_contact_settings["NC1"] new_data: dict[str, Any] = {"id": "NC1", "load_name": "NC1 Test"} new_model = replace(dry_contact, **new_data) await envoy.update_dry_contact(new_data) assert respx.calls.last.request.content == orjson.dumps( {"dry_contacts": new_model.to_api()} ) if envoy.data.dry_contact_settings["NC1"].black_start is not None: assert ( new_model.to_api()["black_s_start"] == envoy.data.dry_contact_settings["NC1"].black_start ) else: assert "black_s_start" not in new_model.to_api() await envoy.open_dry_contact("NC1") assert envoy.data.dry_contact_status["NC1"].status == DryContactStatus.OPEN assert respx.calls.last.request.content == orjson.dumps( {"dry_contacts": {"id": "NC1", "status": "open"}} ) await envoy.close_dry_contact("NC1") assert envoy.data.dry_contact_status["NC1"].status == DryContactStatus.CLOSED assert respx.calls.last.request.content == orjson.dumps( {"dry_contacts": {"id": "NC1", "status": "closed"}} ) assert "Sending POST" in caplog.text else: with pytest.raises(EnvoyFeatureNotAvailable): await envoy.go_off_grid() with pytest.raises(EnvoyFeatureNotAvailable): await envoy.go_on_grid() with pytest.raises(EnvoyFeatureNotAvailable): await envoy.update_dry_contact({"id": "NC1"}) with pytest.raises(EnvoyFeatureNotAvailable): await envoy.update_dry_contact({"id": "NC1"}) with pytest.raises(EnvoyFeatureNotAvailable): await envoy.open_dry_contact("NC1") with pytest.raises(EnvoyFeatureNotAvailable): await envoy.close_dry_contact("NC1") if supported_features & SupportedFeatures.GENERATOR: # COV ensemble ENDPOINT_PROBE_EXCEPTIONS respx.get("/ivp/ss/gen_config").mock( return_value=Response( 500, json=load_json_fixture(version, "ivp_ss_gen_config") ) ) await envoy.probe() # restore from prior changes respx.get("/ivp/ss/gen_config").mock( return_value=Response( 200, json=load_json_fixture(version, "ivp_ss_gen_config") ) ) await envoy.probe() if (supported_features & SupportedFeatures.ENCHARGE) and ( supported_features & SupportedFeatures.TARIFF ): # Test `savings-mode` is converted to `economy` if ( envoy.data.raw[URL_TARIFF]["tariff"]["storage_settings"]["mode"] == "savings-mode" ): assert envoy.data.tariff.storage_settings.mode == EnvoyStorageMode.SAVINGS storage_settings = envoy.data.tariff.storage_settings new_data = {"charge_from_grid": True} new_model = replace(storage_settings, **new_data) if envoy.data.tariff.storage_settings.date is not None: assert new_model.to_api()["date"] == envoy.data.tariff.storage_settings.date else: assert "date" not in new_model.to_api() # Test setting battery features await envoy.enable_charge_from_grid() assert envoy.data.tariff.storage_settings.charge_from_grid is True assert respx.calls.last.request.content == orjson.dumps( {"tariff": envoy.data.tariff.to_api()} ) await envoy.disable_charge_from_grid() assert envoy.data.tariff.storage_settings.charge_from_grid is False assert respx.calls.last.request.content == orjson.dumps( # type: ignore[unreachable] {"tariff": envoy.data.tariff.to_api()} ) await envoy.set_reserve_soc(50) assert envoy.data.tariff.storage_settings.reserved_soc == round(float(50), 1) assert respx.calls.last.request.content == orjson.dumps( {"tariff": envoy.data.tariff.to_api()} ) await envoy.set_storage_mode(EnvoyStorageMode.SELF_CONSUMPTION) assert ( envoy.data.tariff.storage_settings.mode == EnvoyStorageMode.SELF_CONSUMPTION ) assert respx.calls.last.request.content == orjson.dumps( {"tariff": envoy.data.tariff.to_api()} ) with pytest.raises(TypeError): await envoy.set_storage_mode("invalid") # COV test with missing logger json_data = load_json_fixture(version, "admin_lib_tariff") del json_data["tariff"]["logger"] respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) respx.put("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) await envoy.update() envoy.data.tariff.to_api() # COV test with missing date for tariff and storage settings json_data = load_json_fixture(version, "admin_lib_tariff") del json_data["tariff"]["date"] del json_data["tariff"]["storage_settings"]["date"] respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) respx.put("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) await envoy.update() envoy.data.tariff.to_api() # COV test with missing storage settings json_data = load_json_fixture(version, "admin_lib_tariff") del json_data["tariff"]["storage_settings"] respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) respx.put("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) await envoy.update() envoy.data.tariff.to_api() # COV test with error in result json_data = load_json_fixture(version, "admin_lib_tariff") json_data.update({"error": "error"}) respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) try: await envoy.probe() except AttributeError: assert "No tariff data found" in caplog.text # COV test with no enpower features json_data = load_json_fixture(version, "ivp_ensemble_inventory") json_data[0]["type"] = "NOEXCHARGE" respx.get("/ivp/ensemble/inventory").mock( return_value=Response(200, json=json_data) ) await envoy.probe() await envoy.update() # COV ensemble ENDPOINT_PROBE_EXCEPTIONS respx.get("/ivp/ensemble/inventory").mock( return_value=Response( 500, json=load_json_fixture(version, "ivp_ensemble_inventory") ) ) await envoy.probe() # restore from prior changes respx.get("/ivp/ensemble/inventory").mock( return_value=Response( 200, json=load_json_fixture(version, "ivp_ensemble_inventory") ) ) json_data = load_json_fixture(version, "admin_lib_tariff") respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) bad_envoy = await get_mock_envoy() await bad_envoy.probe() with pytest.raises(EnvoyFeatureNotAvailable): bad_envoy.data.tariff.storage_settings = None await bad_envoy.enable_charge_from_grid() with pytest.raises(ValueError): bad_envoy.data.tariff = None await bad_envoy.enable_charge_from_grid() with pytest.raises(ValueError): bad_envoy.data = None await bad_envoy.enable_charge_from_grid() else: with pytest.raises(EnvoyFeatureNotAvailable): await envoy.enable_charge_from_grid() with pytest.raises(EnvoyFeatureNotAvailable): await envoy.disable_charge_from_grid() assert envoy.phase_count == phase_count assert envoy.ct_meter_count == common_properties["ctMeters"] assert envoy.phase_count == common_properties["phaseCount"] assert envoy.phase_mode == common_properties["phaseMode"] assert envoy.consumption_meter_type == common_properties["consumptionMeter"] assert envoy.production_meter_type == common_properties["productionMeter"] assert envoy.storage_meter_type == common_properties["storageMeter"] # are CT types represented correctly in model assert (str(envoy.storage_meter_type) in envoy.envoy_model) != ( envoy.storage_meter_type is None ) assert (str(envoy.production_meter_type) in envoy.envoy_model) != ( envoy.production_meter_type is None ) assert (str(envoy.storage_meter_type) in envoy.envoy_model) != ( envoy.storage_meter_type is None ) # data is the original collected envoy.data # are all production phases reported expected_phases = production_phases == {} actual_phases = data.system_production_phases is None assert not (expected_phases ^ actual_phases) # are all consumption phases reported expected_phases = consumption_phases == {} actual_phases = data.system_consumption_phases is None assert not (expected_phases ^ actual_phases) reported_phase_count = envoy.active_phase_count # are all production phases reported expected_phase_count = len(production_phases) assert expected_phase_count == reported_phase_count # are all consumption phases reported expected_phase_count = len(consumption_phases) assert expected_phase_count == reported_phase_count # Test each production phase for phase in production_phases: proddata = envoy.data.system_production_phases[phase] modeldata = production_phases[phase] # test each element of the phase data assert proddata.watt_hours_lifetime == modeldata["watt_hours_lifetime"] assert proddata.watt_hours_last_7_days == modeldata["watt_hours_last_7_days"] assert proddata.watt_hours_today == modeldata["watt_hours_today"] assert proddata.watts_now == modeldata["watts_now"] # are all consumption phases reported assert ( envoy.active_phase_count == 0 if data.system_consumption_phases is None else len(data.system_consumption_phases) ) # Test each consumption phase for phase in consumption_phases: consdata = envoy.data.system_consumption_phases[phase] modeldata = consumption_phases[phase] # test each element of the phase data assert consdata.watt_hours_lifetime == modeldata["watt_hours_lifetime"] assert consdata.watt_hours_last_7_days == modeldata["watt_hours_last_7_days"] assert consdata.watt_hours_today == modeldata["watt_hours_today"] assert consdata.watts_now == modeldata["watts_now"] # test ct production meter values for key in ct_production: assert ct_production[key] == getattr(envoy.data.ctmeter_production, key) # are all CT production phases reported assert ( len(ct_production_phases) == 0 if data.ctmeter_production_phases is None else len(data.ctmeter_production_phases) ) # Test each ct production phase for phase in ct_production_phases: proddata = envoy.data.ctmeter_production_phases[phase] modeldata = ct_production_phases[phase] # test each element of the phase data for key in modeldata: assert modeldata[key] == getattr(proddata, key) # test ct consumption meter values for key in ct_consumption: assert ct_consumption[key] == getattr(envoy.data.ctmeter_consumption, key) # are all consumption CT phases reported assert ( len(ct_consumption_phases) == 0 if data.ctmeter_consumption_phases is None else len(data.ctmeter_consumption_phases) ) # Test each ct consumption phase for phase in ct_consumption_phases: consdata = envoy.data.ctmeter_consumption_phases[phase] modeldata = ct_consumption_phases[phase] # test each element of the phase data for key in modeldata: assert modeldata[key] == getattr(consdata, key) # test ct storage meter values for key in ct_storage: assert ct_storage[key] == getattr(envoy.data.ctmeter_storage, key) # test expected vs actual phases reported assert ( len(ct_storage_phases) == 0 if data.ctmeter_storage_phases is None else len(data.ctmeter_storage_phases) ) # Test each ct storage phase for phase in ct_storage_phases: storedata = envoy.data.ctmeter_storage_phases[phase] modeldata = ct_storage_phases[phase] # test each element of the phase data for key in modeldata: assert modeldata[key] == getattr(storedata, key) # COV test with no production segment if "production" in files: try: json_data = load_json_fixture(version, "production") except json.decoder.JSONDecodeError: json_data = None if json_data: del json_data["production"] respx.get("/production").mock(return_value=Response(200, json=json_data)) else: respx.get("/production").mock(return_value=Response(404)) try: await envoy.probe() except EnvoyProbeFailed: pass pyenphase-pyenphase-1bfa6dd/tests/test_firmware.py000066400000000000000000000106321464551303400226470ustar00rootroot00000000000000"""Test firmware functions.""" import logging import pytest import respx from httpx import Response from pyenphase import Envoy from pyenphase.exceptions import EnvoyFirmwareCheckError from .common import prep_envoy, start_7_firmware_mock LOGGER = logging.getLogger(__name__) @pytest.mark.asyncio @respx.mock async def test_firmware_with_7_6_175_standard(): """Test firmware is processed ok.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version) info = ( "" "" " " " 123456789012" " 800-12345-r99" " D7.8.901" " " "" ) respx.get("/info").mock(return_value=Response(200, text=info)) envoy = Envoy("127.0.0.1") await envoy.setup() assert envoy.firmware == "7.8.901" assert envoy.serial_number == "123456789012" assert envoy.part_number == "800-12345-r99" @pytest.mark.asyncio @respx.mock async def test_firmware_no_sn_with_7_6_175_standard(): """Test missing serial number in info""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version) info = ( "" "" " " " 800-12345-r99" " D7.8.901" " " "" ) respx.get("/info").mock(return_value=Response(200, text=info)) envoy = Envoy("127.0.0.1") await envoy.setup() assert envoy.firmware == "7.8.901" assert envoy.serial_number is None assert envoy.part_number == "800-12345-r99" @pytest.mark.asyncio @respx.mock async def test_firmware_no_pn_with_7_6_175_standard(): """Test missing pb in info""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version) info = ( "" "" " " " 123456789012" " D7.8.901" " " "" ) respx.get("/info").mock(return_value=Response(200, text=info)) envoy = Envoy("127.0.0.1") await envoy.setup() assert envoy.firmware == "7.8.901" assert envoy.serial_number == "123456789012" assert envoy.part_number is None @pytest.mark.asyncio @respx.mock async def test_firmware_no_fw_with_7_6_175_standard(): """Test missing fw in info""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version) info = ( "" "" " " " 123456789012" " 800-12345-r99" " " "" ) respx.get("/info").mock(return_value=Response(200, text=info)) envoy = Envoy("127.0.0.1") await envoy.setup() assert envoy.firmware is None assert envoy.serial_number == "123456789012" assert envoy.part_number == "800-12345-r99" @pytest.mark.asyncio @respx.mock async def test_firmware_no_device_with_7_6_175_standard(): """Test missing device xml segment in info""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version) info = "" "" "" respx.get("/info").mock(return_value=Response(200, text=info)) envoy = Envoy("127.0.0.1") await envoy.setup() assert envoy.firmware is None assert envoy.serial_number is None assert envoy.part_number is None @pytest.mark.asyncio @respx.mock async def test_firmware_no_200__with_7_6_175_standard(): """Test other status as 200 returned""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version) info = "" "" "" respx.get("/info").mock(return_value=Response(500, text=info)) envoy = Envoy("127.0.0.1") with pytest.raises(EnvoyFirmwareCheckError): await envoy.setup() pyenphase-pyenphase-1bfa6dd/tests/test_pre_v7_endpoints.py000066400000000000000000001403351464551303400243240ustar00rootroot00000000000000"""Test envoy firmware prior to v7.""" import json import logging import re from os import listdir from os.path import isfile, join import pytest import respx from httpx import Response from pyenphase import EnvoyInverter, register_updater from pyenphase.const import URL_PRODUCTION from pyenphase.envoy import SupportedFeatures, get_updaters from pyenphase.exceptions import ( ENDPOINT_PROBE_EXCEPTIONS, EnvoyAuthenticationRequired, EnvoyFeatureNotAvailable, EnvoyPoorDataQuality, EnvoyProbeFailed, ) from pyenphase.models.envoy import EnvoyData from pyenphase.models.system_production import EnvoySystemProduction from pyenphase.updaters.base import EnvoyUpdater from .common import get_mock_envoy, load_fixture, load_json_fixture, updater_features LOGGER = logging.getLogger(__name__) @pytest.mark.asyncio @respx.mock async def test_with_4_2_27_firmware(): """Verify with 4.2.27 firmware.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "4.2.27" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock(return_value=Response(404)) respx.get("/production.json").mock( return_value=Response(200, json=load_json_fixture(version, "production.json")) ) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock(return_value=Response(404)) path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(404)) if "ivp_ss_gen_config" in files: try: json_data = load_json_fixture(version, "ivp_ss_gen_config") except json.decoder.JSONDecodeError: json_data = {} respx.get("/ivp/ss/gen_config").mock(return_value=Response(200, json=json_data)) else: respx.get("/ivp/ss/gen_config").mock(return_value=Response(200, json={})) respx.get("/ivp/meters").mock(return_value=Response(200, json=[])) envoy = await get_mock_envoy() data: EnvoyData | None = envoy.data assert data is not None assert not (envoy._supported_features & SupportedFeatures.METERING) assert not (envoy._supported_features & SupportedFeatures.INVERTERS) assert not (envoy._supported_features & SupportedFeatures.TOTAL_CONSUMPTION) assert not (envoy._supported_features & SupportedFeatures.NET_CONSUMPTION) assert updater_features(envoy._updaters) == { "EnvoyApiV1ProductionUpdater": SupportedFeatures.PRODUCTION, } assert envoy.part_number == "800-00551-r02" assert data.system_production is not None assert ( data.system_production.watts_now == 5894 ) # This used to use the production.json endpoint, but its always a bit behind assert data.system_production.watt_hours_today == 17920 assert data.system_production.watt_hours_last_7_days == 276614 assert data.system_production.watt_hours_lifetime == 10279087 assert not data.inverters assert envoy.ct_meter_count == 0 assert envoy.phase_count == 1 assert envoy.phase_mode is None assert envoy.consumption_meter_type is None assert not data.system_consumption_phases assert not data.system_production_phases assert envoy.envoy_model == "Envoy" # Test that Ensemble commands raise FeatureNotAvailable with pytest.raises(EnvoyFeatureNotAvailable): await envoy.go_off_grid() with pytest.raises(EnvoyFeatureNotAvailable): await envoy.go_on_grid() @pytest.mark.asyncio @respx.mock async def test_with_5_0_49_firmware(): """Verify with 5.0.49 firmware.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "5.0.49" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock(return_value=Response(404)) respx.get("/production.json").mock( return_value=Response(200, json=load_json_fixture(version, "production.json")) ) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(404)) if "ivp_ss_gen_config" in files: try: json_data = load_json_fixture(version, "ivp_ss_gen_config") except json.decoder.JSONDecodeError: json_data = {} respx.get("/ivp/ss/gen_config").mock(return_value=Response(200, json=json_data)) else: respx.get("/ivp/ss/gen_config").mock(return_value=Response(200, json={})) respx.get("/ivp/meters").mock(return_value=Response(404)) envoy = await get_mock_envoy() data = envoy.data assert data is not None assert not (envoy._supported_features & SupportedFeatures.TOTAL_CONSUMPTION) assert not (envoy._supported_features & SupportedFeatures.NET_CONSUMPTION) assert envoy._supported_features & SupportedFeatures.INVERTERS assert updater_features(envoy._updaters) == { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyApiV1ProductionUpdater": SupportedFeatures.PRODUCTION, } assert envoy.part_number == "800-00551-r02" assert envoy.phase_count == 1 assert not data.system_consumption assert envoy.ct_meter_count == 0 assert envoy.phase_count == 1 assert envoy.phase_mode is None assert envoy.consumption_meter_type is None assert not data.system_consumption_phases assert not data.system_production_phases assert data.system_production.watts_now == 4859 assert data.system_production.watt_hours_today == 5046 assert data.system_production.watt_hours_last_7_days == 445686 assert data.system_production.watt_hours_lifetime == 88742152 assert data.inverters == { "121547055830": EnvoyInverter( serial_number="121547055830", last_report_date=1618083280, last_report_watts=131, max_report_watts=257, ), "121547059008": EnvoyInverter( serial_number="121547059008", last_report_date=1618083240, last_report_watts=133, max_report_watts=257, ), "121547059079": EnvoyInverter( serial_number="121547059079", last_report_date=1618083244, last_report_watts=130, max_report_watts=257, ), "121547059102": EnvoyInverter( serial_number="121547059102", last_report_date=1618083273, last_report_watts=134, max_report_watts=257, ), "121547059107": EnvoyInverter( serial_number="121547059107", last_report_date=1618083265, last_report_watts=132, max_report_watts=257, ), "121547059108": EnvoyInverter( serial_number="121547059108", last_report_date=1618083266, last_report_watts=131, max_report_watts=257, ), "121547059112": EnvoyInverter( serial_number="121547059112", last_report_date=1618083286, last_report_watts=132, max_report_watts=257, ), "121547059128": EnvoyInverter( serial_number="121547059128", last_report_date=1618083262, last_report_watts=135, max_report_watts=257, ), "121547059193": EnvoyInverter( serial_number="121547059193", last_report_date=1618083250, last_report_watts=131, max_report_watts=257, ), "121547059202": EnvoyInverter( serial_number="121547059202", last_report_date=1618083251, last_report_watts=133, max_report_watts=257, ), "121547059217": EnvoyInverter( serial_number="121547059217", last_report_date=1618083281, last_report_watts=137, max_report_watts=257, ), "121547059253": EnvoyInverter( serial_number="121547059253", last_report_date=1618083289, last_report_watts=131, max_report_watts=257, ), "121547059333": EnvoyInverter( serial_number="121547059333", last_report_date=1618083277, last_report_watts=134, max_report_watts=257, ), "121547059354": EnvoyInverter( serial_number="121547059354", last_report_date=1618083287, last_report_watts=132, max_report_watts=257, ), "121547059355": EnvoyInverter( serial_number="121547059355", last_report_date=1618083263, last_report_watts=131, max_report_watts=258, ), "121547059357": EnvoyInverter( serial_number="121547059357", last_report_date=1618083254, last_report_watts=133, max_report_watts=257, ), "121547059359": EnvoyInverter( serial_number="121547059359", last_report_date=1618083247, last_report_watts=134, max_report_watts=257, ), "121547059360": EnvoyInverter( serial_number="121547059360", last_report_date=1618083245, last_report_watts=131, max_report_watts=257, ), "121547059363": EnvoyInverter( serial_number="121547059363", last_report_date=1618083255, last_report_watts=131, max_report_watts=257, ), "121547059381": EnvoyInverter( serial_number="121547059381", last_report_date=1618083259, last_report_watts=132, max_report_watts=257, ), "121547059889": EnvoyInverter( serial_number="121547059889", last_report_date=1618083264, last_report_watts=133, max_report_watts=257, ), "121547060383": EnvoyInverter( serial_number="121547060383", last_report_date=1618083257, last_report_watts=135, max_report_watts=258, ), "121547060384": EnvoyInverter( serial_number="121547060384", last_report_date=1618083250, last_report_watts=134, max_report_watts=257, ), "121547060392": EnvoyInverter( serial_number="121547060392", last_report_date=1618083288, last_report_watts=133, max_report_watts=257, ), "121547060396": EnvoyInverter( serial_number="121547060396", last_report_date=1618083269, last_report_watts=133, max_report_watts=257, ), "121547060412": EnvoyInverter( serial_number="121547060412", last_report_date=1618083258, last_report_watts=131, max_report_watts=257, ), "121547060415": EnvoyInverter( serial_number="121547060415", last_report_date=1618083267, last_report_watts=133, max_report_watts=257, ), "121547060590": EnvoyInverter( serial_number="121547060590", last_report_date=1618083277, last_report_watts=133, max_report_watts=257, ), "121547060592": EnvoyInverter( serial_number="121547060592", last_report_date=1618083279, last_report_watts=133, max_report_watts=257, ), "121547060593": EnvoyInverter( serial_number="121547060593", last_report_date=1618083271, last_report_watts=133, max_report_watts=257, ), "121547060643": EnvoyInverter( serial_number="121547060643", last_report_date=1618083284, last_report_watts=131, max_report_watts=257, ), "121547060647": EnvoyInverter( serial_number="121547060647", last_report_date=1618083285, last_report_watts=134, max_report_watts=258, ), "121547060650": EnvoyInverter( serial_number="121547060650", last_report_date=1618083253, last_report_watts=131, max_report_watts=257, ), "121547060670": EnvoyInverter( serial_number="121547060670", last_report_date=1618083270, last_report_watts=134, max_report_watts=257, ), "121547060671": EnvoyInverter( serial_number="121547060671", last_report_date=1618083283, last_report_watts=135, max_report_watts=257, ), "121547060727": EnvoyInverter( serial_number="121547060727", last_report_date=1618083275, last_report_watts=134, max_report_watts=257, ), "121547060758": EnvoyInverter( serial_number="121547060758", last_report_date=1618083274, last_report_watts=130, max_report_watts=255, ), "121547060761": EnvoyInverter( serial_number="121547060761", last_report_date=1618083260, last_report_watts=133, max_report_watts=257, ), "121547060766": EnvoyInverter( serial_number="121547060766", last_report_date=1618083242, last_report_watts=132, max_report_watts=257, ), "121547060773": EnvoyInverter( serial_number="121547060773", last_report_date=1618083247, last_report_watts=132, max_report_watts=257, ), } assert envoy.envoy_model == "Envoy" @pytest.mark.asyncio @respx.mock async def test_with_3_7_0_firmware(): """Verify with 3.7.0 firmware.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.7.0" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock( return_value=Response(200, text=load_fixture(version, "production")) ) respx.get("/production.json").mock(return_value=Response(404)) respx.get("/api/v1/production").mock( return_value=Response( 404, ) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 404, ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) respx.get("/admin/lib/tariff").mock(return_value=Response(404)) respx.get("/ivp/meters").mock(return_value=Response(404)) # Verify the library does not support scraping to comply with ADR004 with pytest.raises(EnvoyProbeFailed): await get_mock_envoy() # Test the register interface by registering a legacy production scraper # # ADR004 compliance: # We won't do this in our production code as we don't support scraping, but # we want to leave the door open for custom components to use the interface. # _KEY_TO_REGEX = { "watts_now": r"Current.*\s*\s*(\d+|\d+\.\d+)\s*(W|kW|MW)", "watt_hours_last_7_days": r"Past Week\s*\s*(\d+|\d+\.\d+)\s*(Wh|kWh|MWh)", "watt_hours_today": r"Today\s*\s*(\d+|\d+\.\d+)\s*(Wh|kWh|MWh)", "watt_hours_lifetime": r"Since Installation\s*\s*(\d+|\d+\.\d+)\s*(Wh|kWh|MWh)", } class LegacyEnvoySystemProduction(EnvoySystemProduction): @classmethod def from_production_legacy(cls, text: str) -> EnvoySystemProduction: """Legacy parser.""" data: dict[str, int] = { "watts_now": 0, "watt_hours_today": 0, "watt_hours_last_7_days": 0, "watt_hours_lifetime": 0, } for key, regex in _KEY_TO_REGEX.items(): if match := re.search(regex, text, re.MULTILINE): unit = match.group(2).lower() value = float(match.group(1)) if unit.startswith("k"): value *= 1000 elif unit.startswith("m"): value *= 1000000 data[key] = int(value) return cls(**data) class LegacyProductionScraper(EnvoyUpdater): async def probe( self, discovered_features: SupportedFeatures ) -> SupportedFeatures | None: """Probe the Envoy for this updater and return SupportedFeatures.""" if SupportedFeatures.PRODUCTION in discovered_features: # Already discovered from another updater return None try: response = await self._probe_request(URL_PRODUCTION) data = response.text except ENDPOINT_PROBE_EXCEPTIONS: return None if "Since Installation" not in data: return None self._supported_features |= SupportedFeatures.PRODUCTION return self._supported_features async def update(self, envoy_data: EnvoyData) -> None: """Update the Envoy for this updater.""" response = await self._request(URL_PRODUCTION) production_data = response.text envoy_data.raw[URL_PRODUCTION] = production_data envoy_data.system_production = ( LegacyEnvoySystemProduction.from_production_legacy(production_data) ) remove = register_updater(LegacyProductionScraper) assert LegacyProductionScraper in get_updaters() try: envoy = await get_mock_envoy() data = envoy.data assert data is not None assert not (envoy._supported_features & SupportedFeatures.TOTAL_CONSUMPTION) assert not (envoy._supported_features & SupportedFeatures.NET_CONSUMPTION) assert not (envoy._supported_features & SupportedFeatures.INVERTERS) assert updater_features(envoy._updaters) == { "LegacyProductionScraper": SupportedFeatures.PRODUCTION, } assert envoy.part_number == "800-00069-r05" assert not data.system_consumption assert data.system_production.watts_now == 6630 assert data.system_production.watt_hours_today == 53600 assert data.system_production.watt_hours_last_7_days == 405000 assert data.system_production.watt_hours_lifetime == 133000000 assert not data.inverters assert envoy.ct_meter_count == 0 assert envoy.phase_count == 1 assert envoy.phase_mode is None assert envoy.consumption_meter_type is None assert not data.system_consumption_phases assert not data.system_production_phases assert envoy.envoy_model == "Envoy" finally: remove() assert LegacyProductionScraper not in get_updaters() @pytest.mark.asyncio @respx.mock async def test_with_3_9_36_firmware_bad_auth(): """Verify with 3.9.36 firmware with incorrect auth.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.9.36_bad_auth" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock(return_value=Response(404)) respx.get("/production.json").mock(return_value=Response(404)) respx.get("/api/v1/production").mock( return_value=Response(401, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(401)) respx.get("/ivp/meters").mock(return_value=Response(200, json=[])) with pytest.raises(EnvoyAuthenticationRequired): await get_mock_envoy() @pytest.mark.asyncio @respx.mock async def test_with_3_9_36_firmware_no_inverters(): """Verify with 3.9.36 firmware with auth that does not allow inverters.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.9.36_bad_auth" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock(return_value=Response(404)) respx.get("/production.json").mock(return_value=Response(404)) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 401, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(401)) respx.get("/ivp/meters").mock(return_value=Response(404)) envoy = await get_mock_envoy() data = envoy.data assert data is not None assert not (envoy._supported_features & SupportedFeatures.TOTAL_CONSUMPTION) assert not (envoy._supported_features & SupportedFeatures.NET_CONSUMPTION) assert not (envoy._supported_features & SupportedFeatures.INVERTERS) assert updater_features(envoy._updaters) == { "EnvoyApiV1ProductionUpdater": SupportedFeatures.PRODUCTION, } assert envoy.part_number == "800-00069-r05" assert envoy.ct_meter_count == 0 assert envoy.phase_count == 1 assert envoy.phase_mode is None assert envoy.consumption_meter_type is None assert not data.system_consumption_phases assert not data.system_production_phases @pytest.mark.asyncio @respx.mock async def test_with_3_9_36_firmware(): """Verify with 3.9.36 firmware.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.9.36" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock(return_value=Response(404)) respx.get("/production.json").mock(return_value=Response(404)) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(401)) respx.get("/ivp/meters").mock( return_value=Response(404, json={"error": "404 - Not Found"}) ) envoy = await get_mock_envoy() data = envoy.data assert data is not None assert not (envoy._supported_features & SupportedFeatures.TOTAL_CONSUMPTION) assert not (envoy._supported_features & SupportedFeatures.NET_CONSUMPTION) assert envoy._supported_features & SupportedFeatures.INVERTERS assert updater_features(envoy._updaters) == { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyApiV1ProductionUpdater": SupportedFeatures.PRODUCTION, } assert envoy.part_number == "800-00069-r05" assert not data.system_consumption assert envoy.ct_meter_count == 0 assert envoy.phase_count == 1 assert envoy.phase_mode is None assert envoy.consumption_meter_type is None assert not data.system_consumption_phases assert not data.system_production_phases assert data.system_production.watts_now == 1271 assert data.system_production.watt_hours_today == 1460 assert data.system_production.watt_hours_last_7_days == 130349 assert data.system_production.watt_hours_lifetime == 6012540 assert data.inverters == { "121547058983": EnvoyInverter( serial_number="121547058983", last_report_date=1618083969, last_report_watts=137, max_report_watts=238, ), "121547058993": EnvoyInverter( serial_number="121547058993", last_report_date=1618083961, last_report_watts=138, max_report_watts=231, ), "121547060394": EnvoyInverter( serial_number="121547060394", last_report_date=1618083966, last_report_watts=138, max_report_watts=238, ), "121547060402": EnvoyInverter( serial_number="121547060402", last_report_date=1618083962, last_report_watts=138, max_report_watts=240, ), "121547060495": EnvoyInverter( serial_number="121547060495", last_report_date=1618083959, last_report_watts=135, max_report_watts=228, ), "121547060638": EnvoyInverter( serial_number="121547060638", last_report_date=1618083966, last_report_watts=139, max_report_watts=241, ), "121547060646": EnvoyInverter( serial_number="121547060646", last_report_date=1618083957, last_report_watts=139, max_report_watts=240, ), "121547060652": EnvoyInverter( serial_number="121547060652", last_report_date=1618083959, last_report_watts=140, max_report_watts=245, ), "121603025842": EnvoyInverter( serial_number="121603025842", last_report_date=1618083963, last_report_watts=139, max_report_watts=260, ), "121603034267": EnvoyInverter( serial_number="121603034267", last_report_date=1618083956, last_report_watts=138, max_report_watts=244, ), "121603038867": EnvoyInverter( serial_number="121603038867", last_report_date=1618083964, last_report_watts=138, max_report_watts=242, ), "121603039216": EnvoyInverter( serial_number="121603039216", last_report_date=1618083968, last_report_watts=139, max_report_watts=273, ), } assert envoy.envoy_model == "Envoy" @pytest.mark.asyncio @respx.mock async def test_with_3_9_36_firmware_with_production_401(): """Verify with 3.9.36 firmware when /production throws a 401.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.9.36" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock(return_value=Response(401)) respx.get("/production.json").mock(return_value=Response(404)) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(404)) respx.get("/ivp/meters").mock(return_value=Response(404)) envoy = await get_mock_envoy() data = envoy.data assert data is not None assert not (envoy._supported_features & SupportedFeatures.TOTAL_CONSUMPTION) assert not (envoy._supported_features & SupportedFeatures.NET_CONSUMPTION) assert envoy._supported_features & SupportedFeatures.INVERTERS assert updater_features(envoy._updaters) == { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyApiV1ProductionUpdater": SupportedFeatures.PRODUCTION, } assert envoy.part_number == "800-00069-r05" assert not data.system_consumption assert data.system_production.watts_now == 1271 assert data.system_production.watt_hours_today == 1460 assert data.system_production.watt_hours_last_7_days == 130349 assert data.system_production.watt_hours_lifetime == 6012540 assert data.inverters assert envoy.ct_meter_count == 0 assert envoy.phase_count == 1 assert envoy.phase_mode is None assert envoy.consumption_meter_type is None assert not data.system_consumption_phases assert not data.system_production_phases @pytest.mark.asyncio @respx.mock async def test_with_3_9_36_firmware_with_production_and_production_json_401(): """Verify with 3.9.36 firmware when /production and /production.json throws a 401.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.9.36" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock(return_value=Response(401)) respx.get("/production.json").mock(return_value=Response(401)) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(404)) respx.get("/ivp/meters").mock(return_value=Response(200, json=[])) with pytest.raises(EnvoyAuthenticationRequired): await get_mock_envoy() @pytest.mark.asyncio @respx.mock async def test_with_3_9_36_firmware_with_meters_401(): """Verify with 3.9.36 firmware when /ivp/meters throws a 401.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.9.36" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock(return_value=Response(404)) respx.get("/production.json").mock(return_value=Response(401)) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(404)) respx.get("/ivp/meters").mock(return_value=Response(401)) with pytest.raises(EnvoyAuthenticationRequired): await get_mock_envoy() @pytest.mark.asyncio @respx.mock async def test_with_3_8_10_firmware_with_meters_401(): """Verify with 3.8.10 firmware when /ivp/meters throws a 401.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.8.10" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock(return_value=Response(404)) respx.get("/production.json").mock(return_value=Response(401)) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(404)) respx.get("/ivp/meters").mock(return_value=Response(401)) with pytest.raises(EnvoyAuthenticationRequired): await get_mock_envoy() @pytest.mark.asyncio @respx.mock async def test_with_3_17_3_firmware(): """Verify with 3.17.3 firmware.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.17.3" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock(return_value=Response(404)) respx.get("/production.json").mock(return_value=Response(404)) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(404)) respx.get("/ivp/meters").mock(return_value=Response(200, json=[])) envoy = await get_mock_envoy() data = envoy.data assert data is not None assert not (envoy._supported_features & SupportedFeatures.TOTAL_CONSUMPTION) assert not (envoy._supported_features & SupportedFeatures.NET_CONSUMPTION) assert envoy._supported_features & SupportedFeatures.INVERTERS assert updater_features(envoy._updaters) == { "EnvoyApiV1ProductionInvertersUpdater": SupportedFeatures.INVERTERS, "EnvoyApiV1ProductionUpdater": SupportedFeatures.PRODUCTION, } assert envoy.part_number == "800-00069-r05" assert not data.system_consumption assert envoy.ct_meter_count == 0 assert envoy.phase_count == 1 assert envoy.phase_mode is None assert envoy.consumption_meter_type is None assert not data.system_consumption_phases assert not data.system_production_phases assert data.system_production.watts_now == 5463 assert data.system_production.watt_hours_today == 5481 assert data.system_production.watt_hours_last_7_days == 389581 assert data.system_production.watt_hours_lifetime == 93706280 assert data.inverters == { "121512006273": EnvoyInverter( serial_number="121512006273", last_report_date=1618082959, last_report_watts=206, max_report_watts=254, ), "121512009183": EnvoyInverter( serial_number="121512009183", last_report_date=1618082961, last_report_watts=204, max_report_watts=253, ), "121512033008": EnvoyInverter( serial_number="121512033008", last_report_date=1618082947, last_report_watts=101, max_report_watts=243, ), "121512036220": EnvoyInverter( serial_number="121512036220", last_report_date=1618082927, last_report_watts=198, max_report_watts=245, ), "121512036221": EnvoyInverter( serial_number="121512036221", last_report_date=1618082963, last_report_watts=8, max_report_watts=116, ), "121512036250": EnvoyInverter( serial_number="121512036250", last_report_date=1618082940, last_report_watts=20, max_report_watts=190, ), "121512036336": EnvoyInverter( serial_number="121512036336", last_report_date=1618082932, last_report_watts=199, max_report_watts=247, ), "121512037453": EnvoyInverter( serial_number="121512037453", last_report_date=1618082949, last_report_watts=205, max_report_watts=255, ), "121512038416": EnvoyInverter( serial_number="121512038416", last_report_date=1618082953, last_report_watts=151, max_report_watts=251, ), "121512038421": EnvoyInverter( serial_number="121512038421", last_report_date=1618082949, last_report_watts=14, max_report_watts=233, ), "121512038619": EnvoyInverter( serial_number="121512038619", last_report_date=1618082962, last_report_watts=203, max_report_watts=252, ), "121512038691": EnvoyInverter( serial_number="121512038691", last_report_date=1618082942, last_report_watts=26, max_report_watts=247, ), "121512038762": EnvoyInverter( serial_number="121512038762", last_report_date=1618082930, last_report_watts=203, max_report_watts=253, ), "121512038845": EnvoyInverter( serial_number="121512038845", last_report_date=1618082945, last_report_watts=203, max_report_watts=253, ), "121512038901": EnvoyInverter( serial_number="121512038901", last_report_date=1618082944, last_report_watts=102, max_report_watts=245, ), "121512038919": EnvoyInverter( serial_number="121512038919", last_report_date=1618082959, last_report_watts=102, max_report_watts=238, ), "121512038982": EnvoyInverter( serial_number="121512038982", last_report_date=1618082950, last_report_watts=203, max_report_watts=253, ), "121512039005": EnvoyInverter( serial_number="121512039005", last_report_date=1618082933, last_report_watts=55, max_report_watts=254, ), "121512039018": EnvoyInverter( serial_number="121512039018", last_report_date=1618082964, last_report_watts=27, max_report_watts=252, ), "121512039075": EnvoyInverter( serial_number="121512039075", last_report_date=1618082930, last_report_watts=102, max_report_watts=237, ), "121512039090": EnvoyInverter( serial_number="121512039090", last_report_date=1618082946, last_report_watts=32, max_report_watts=194, ), "121512039091": EnvoyInverter( serial_number="121512039091", last_report_date=1618082939, last_report_watts=27, max_report_watts=252, ), "121512039093": EnvoyInverter( serial_number="121512039093", last_report_date=1618082966, last_report_watts=209, max_report_watts=256, ), "121512039124": EnvoyInverter( serial_number="121512039124", last_report_date=1618082938, last_report_watts=205, max_report_watts=254, ), "121512039143": EnvoyInverter( serial_number="121512039143", last_report_date=1618082956, last_report_watts=104, max_report_watts=245, ), "121512039181": EnvoyInverter( serial_number="121512039181", last_report_date=1618082943, last_report_watts=101, max_report_watts=238, ), "121512041456": EnvoyInverter( serial_number="121512041456", last_report_date=1618082937, last_report_watts=13, max_report_watts=79, ), "121512041640": EnvoyInverter( serial_number="121512041640", last_report_date=1618082927, last_report_watts=200, max_report_watts=249, ), "121512041747": EnvoyInverter( serial_number="121512041747", last_report_date=1618082925, last_report_watts=64, max_report_watts=248, ), "121512042132": EnvoyInverter( serial_number="121512042132", last_report_date=1618082924, last_report_watts=200, max_report_watts=250, ), "121512042344": EnvoyInverter( serial_number="121512042344", last_report_date=1618082952, last_report_watts=205, max_report_watts=253, ), "121512043086": EnvoyInverter( serial_number="121512043086", last_report_date=1618082942, last_report_watts=202, max_report_watts=250, ), "121512043093": EnvoyInverter( serial_number="121512043093", last_report_date=1618082928, last_report_watts=208, max_report_watts=255, ), "121512043135": EnvoyInverter( serial_number="121512043135", last_report_date=1618082923, last_report_watts=205, max_report_watts=254, ), "121512043153": EnvoyInverter( serial_number="121512043153", last_report_date=1618082935, last_report_watts=18, max_report_watts=146, ), "121512043173": EnvoyInverter( serial_number="121512043173", last_report_date=1618082966, last_report_watts=200, max_report_watts=247, ), "121512043200": EnvoyInverter( serial_number="121512043200", last_report_date=1618082955, last_report_watts=203, max_report_watts=253, ), "121512043222": EnvoyInverter( serial_number="121512043222", last_report_date=1618082957, last_report_watts=207, max_report_watts=254, ), "121512043574": EnvoyInverter( serial_number="121512043574", last_report_date=1618082936, last_report_watts=203, max_report_watts=253, ), "121512043587": EnvoyInverter( serial_number="121512043587", last_report_date=1618082934, last_report_watts=202, max_report_watts=253, ), "121512044424": EnvoyInverter( serial_number="121512044424", last_report_date=1618082954, last_report_watts=106, max_report_watts=239, ), } @pytest.mark.asyncio @respx.mock async def test_with_3_17_3_firmware_zero_production(): """Verify with 3.17.3 firmware.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "3.17.3" respx.get("/info").mock( return_value=Response(200, text=load_fixture(version, "info")) ) respx.get("/info.xml").mock(return_value=Response(200, text="")) respx.get("/production").mock(return_value=Response(404)) respx.get("/production.json").mock(return_value=Response(404)) respx.get("/api/v1/production").mock( return_value=Response(200, json=load_json_fixture(version, "api_v1_production")) ) respx.get("/api/v1/production/inverters").mock( return_value=Response( 200, json=load_json_fixture(version, "api_v1_production_inverters") ) ) respx.get("/ivp/ensemble/inventory").mock(return_value=Response(200, json=[])) path = f"tests/fixtures/{version}" files = [f for f in listdir(path) if isfile(join(path, f))] if "admin_lib_tariff" in files: try: json_data = load_json_fixture(version, "admin_lib_tariff") except json.decoder.JSONDecodeError: json_data = None respx.get("/admin/lib/tariff").mock(return_value=Response(200, json=json_data)) else: respx.get("/admin/lib/tariff").mock(return_value=Response(404)) respx.get("/ivp/meters").mock(return_value=Response(200, json=[])) envoy = await get_mock_envoy() respx.get("/api/v1/production").mock( return_value=Response( status_code=200, json={ "wattHoursToday": 0, "wattHoursSevenDays": 0, "wattHoursLifetime": 0, "wattsNow": 0, }, ) ) with pytest.raises(EnvoyPoorDataQuality): await envoy.update() pyenphase-pyenphase-1bfa6dd/tests/test_retries.py000066400000000000000000000366261464551303400225230ustar00rootroot00000000000000"""Test tenacety retry functioning.""" import logging from typing import Any import httpx import orjson import pytest import respx from anyio import EndOfStream from httpx import Response from tenacity import stop_after_attempt, stop_after_delay, wait_none from pyenphase import Envoy from pyenphase.exceptions import ( EnvoyAuthenticationRequired, EnvoyCommunicationError, EnvoyFirmwareCheckError, EnvoyFirmwareFatalCheckError, EnvoyHTTPStatusError, ) from .common import load_fixture, prep_envoy, start_7_firmware_mock LOGGER = logging.getLogger(__name__) @pytest.mark.asyncio @respx.mock async def test_full_connected_from_start_with_7_6_175_standard(): """Test envoy connected and replying from start""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version=version, info=True) envoy = Envoy("127.0.0.1") # remove the waits between retries for this test and set known retries envoy._firmware._get_info.retry.wait = wait_none() envoy._firmware._get_info.retry.stop = stop_after_attempt(3) | stop_after_delay(50) await envoy.setup() await envoy.authenticate("username", "password") # Ensure that there was 1 attempt only. stats: dict[str, Any] = envoy._firmware._get_info.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 1 assert envoy.firmware == "7.6.175" assert envoy.part_number == "800-00656-r06" data = await envoy.update() assert data @pytest.mark.asyncio @respx.mock async def test_full_disconnected_from_start_with_7_6_175_standard(): """Test envoy disconnect at start, should return EnvoyFirmwareFatalCheckError.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) start_7_firmware_mock() envoy = Envoy("127.0.0.1") # remove the waits between retries for this test and set known retries envoy._firmware._get_info.retry.wait = wait_none() envoy._firmware._get_info.retry.stop = stop_after_attempt(3) | stop_after_delay(50) respx.get("/info").mock(return_value=Response(200, text="")).side_effect = ( httpx.ConnectError("Test timeoutexception") ) with pytest.raises(EnvoyFirmwareFatalCheckError): await envoy.setup() # Ensure that there were 3 attempts. stats: dict[str, Any] = envoy._firmware._get_info.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 3 @pytest.mark.asyncio @respx.mock async def test_2_timeout_from_start_with_7_6_175_standard(): """Test envoy timeout at start, timeout is not in retry loop.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) start_7_firmware_mock() envoy = Envoy("127.0.0.1") envoy._firmware._get_info.retry.wait = wait_none() envoy._firmware._get_info.retry.stop = stop_after_attempt(3) | stop_after_delay(50) # test if 2 timeouts return failed respx.get("/info").mock(return_value=Response(200, text="")).side_effect = [ httpx.TimeoutException("Test timeoutexception"), httpx.TimeoutException("Test timeoutexception"), ] with pytest.raises(EnvoyFirmwareFatalCheckError): await envoy.setup() # Ensure that there were no retries. stats: dict[str, Any] = envoy._firmware._get_info.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 1 @pytest.mark.asyncio @respx.mock async def test_httperror_from_start_with_7_6_175_standard(): """Test envoy httperror at start, is not in retry loop.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version=version) envoy = Envoy("127.0.0.1") envoy._firmware._get_info.retry.wait = wait_none() envoy._firmware._get_info.retry.stop = stop_after_attempt(3) | stop_after_delay(50) # test if 2 timeouts return failed respx.get("/info").mock().side_effect = [ httpx.HTTPError("Test timeoutexception"), Response(200, text=load_fixture(version, "info")), ] with pytest.raises(EnvoyFirmwareCheckError): await envoy.setup() # Ensure that there were no retries. stats: dict[str, Any] = envoy._firmware._get_info.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 1 @pytest.mark.asyncio @respx.mock async def test_1_timeout_from_start_with_7_6_175_standard(): """Test envoy timeout at start, timeout is not in retry loop but tries http after https.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version=version) envoy = Envoy("127.0.0.1") envoy._firmware._get_info.retry.wait = wait_none() envoy._firmware._get_info.retry.stop = stop_after_attempt(3) | stop_after_delay(50) # test if 2 timeouts return failed respx.get("/info").mock().side_effect = [ httpx.TimeoutException("Test timeoutexception"), Response(200, text=load_fixture(version, "info")), ] await envoy.setup() await envoy.authenticate("username", "password") # Ensure that there were no retries. stats: dict[str, Any] = envoy._firmware._get_info.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 1 assert envoy.firmware == "7.6.175" assert envoy.part_number == "800-00656-r06" data = await envoy.update() assert data @pytest.mark.asyncio @respx.mock async def test_5_not_connected_at_start_with_7_6_175_standard(): """Test 5 connection failures at start and last one works""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version) envoy = Envoy("127.0.0.1") # remove the waits between retries for this test and set known retries envoy._firmware._get_info.retry.wait = wait_none() envoy._firmware._get_info.retry.stop = stop_after_attempt(3) | stop_after_delay(50) # we need 2 side effects for each try as https and then http is attempted respx.get("/info").mock().side_effect = [ httpx.ConnectError("Test timeoutexception"), httpx.ConnectError("Test timeoutexception"), httpx.ConnectError("Test timeoutexception"), httpx.ConnectError("Test timeoutexception"), httpx.ConnectError("Test timeoutexception"), Response(200, text=load_fixture(version, "info")), ] await envoy.setup() await envoy.authenticate("username", "password") # Ensure that there were no retries. stats: dict[str, Any] = envoy._firmware._get_info.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 3 assert envoy.firmware == "7.6.175" assert envoy.part_number == "800-00656-r06" data = await envoy.update() assert data @pytest.mark.asyncio @respx.mock async def test_2_network_errors_at_start_with_7_6_175_standard(): """Test 2 network error failures at start and 3th works""" logging.getLogger("pyenphase").setLevel(logging.WARN) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version) envoy = Envoy("127.0.0.1") # remove the waits between retries for this test and set known retries envoy._firmware._get_info.retry.wait = wait_none() envoy._firmware._get_info.retry.stop = stop_after_attempt(3) | stop_after_delay(50) # we need 2 side effects for each try as https and then http is attempted respx.get("/info").mock().side_effect = [ httpx.NetworkError("Test timeoutexception"), httpx.RemoteProtocolError("Test timeoutexception"), Response(200, text=load_fixture(version, "info")), ] await envoy.setup() await envoy.authenticate("username", "password") # Ensure that there were no retries. stats: dict[str, Any] = envoy._firmware._get_info.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 3 assert envoy.firmware == "7.6.175" assert envoy.part_number == "800-00656-r06" data = await envoy.update() assert data @pytest.mark.asyncio @respx.mock async def test_3_network_errors_at_start_with_7_6_175_standard(): """Test 3 network error failures at start""" logging.getLogger("pyenphase").setLevel(logging.WARN) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version) envoy = Envoy("127.0.0.1") # remove the waits between retries for this test and set known retries envoy._firmware._get_info.retry.wait = wait_none() envoy._firmware._get_info.retry.stop = stop_after_attempt(3) | stop_after_delay(50) # we need 2 side effects for each try as https and then http is attempted respx.get("/info").mock().side_effect = [ httpx.NetworkError("Test timeoutexception"), httpx.RemoteProtocolError("Test timeoutexception"), httpx.NetworkError("Test timeoutexception"), ] with pytest.raises(EnvoyFirmwareCheckError): await envoy.setup() # Ensure that there were no retries. stats: dict[str, Any] = envoy._firmware._get_info.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 3 @pytest.mark.asyncio @respx.mock async def test_noconnection_at_probe_with_7_6_175_standard(): """Test 3 network error failures at start""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version, info=True) envoy = Envoy("127.0.0.1") # remove the waits between retries for this test and set known retries envoy.probe_request.retry.wait = wait_none() envoy.probe_request.retry.stop = stop_after_attempt(3) | stop_after_delay(50) await envoy.setup() await envoy.authenticate("username", "password") # Ensure that there were no retries. stats: dict[str, Any] = envoy._firmware._get_info.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 1 # Probe is re-calling retried probe_request before returning # we can only see stats for the last request done. # force 3 retries for last one respx.get("/ivp/ss/gen_config").mock().side_effect = [ httpx.NetworkError("Test timeoutexception"), httpx.RemoteProtocolError("Test timeoutexception"), httpx.TimeoutException("Test timeoutexception"), ] await envoy.setup() await envoy.authenticate("username", "password") await envoy.probe() # assert data stats = envoy.probe_request.retry.statistics assert "attempt_number" in stats print(f"--stats--{stats}") assert stats["attempt_number"] == 1 data = await envoy.update() assert data @pytest.mark.asyncio @respx.mock async def test_noconnection_at_update_with_7_6_175_standard(): """Test 3 network error failures at start""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version, info=True) envoy = Envoy("127.0.0.1") # remove the waits between retries for this test and set known retries envoy.request.retry.wait = wait_none() envoy.request.retry.stop = stop_after_attempt(3) | stop_after_delay(50) await envoy.setup() await envoy.authenticate("username", "password") # Ensure that there were no retries. stats: dict[str, Any] = envoy._firmware._get_info.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 1 await envoy.probe() stats = envoy.probe_request.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 1 respx.get("/api/v1/production").mock().side_effect = [ httpx.TimeoutException("Test timeoutexception"), httpx.TimeoutException("Test timeoutexception"), httpx.TimeoutException("Test timeoutexception"), ] with pytest.raises(EnvoyCommunicationError): await envoy.update() respx.get("/api/v1/production").mock().side_effect = [ httpx.ConnectError("Test timeoutexception"), httpx.ConnectError("Test timeoutexception"), httpx.ConnectError("Test timeoutexception"), ] with pytest.raises(EnvoyCommunicationError): await envoy.update() stats = envoy.request.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 3 respx.get("/api/v1/production").mock().side_effect = [ httpx.RemoteProtocolError("Test timeoutexception"), httpx.RemoteProtocolError("Test timeoutexception"), httpx.RemoteProtocolError("Test timeoutexception"), ] with pytest.raises(httpx.RemoteProtocolError): await envoy.update() stats = envoy.request.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 3 respx.get("/api/v1/production").mock().side_effect = [ httpx.NetworkError("Test timeoutexception"), httpx.NetworkError("Test timeoutexception"), httpx.NetworkError("Test timeoutexception"), ] with pytest.raises(EnvoyCommunicationError): await envoy.update() stats = envoy.request.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 3 respx.get("/api/v1/production").mock().side_effect = [ orjson.JSONDecodeError("Test timeoutexception", "that.file", 22), orjson.JSONDecodeError("Test timeoutexception", "that.file", 22), orjson.JSONDecodeError("Test timeoutexception", "that.file", 22), ] with pytest.raises(orjson.JSONDecodeError): await envoy.update() stats = envoy.request.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 3 # other error EnvoyAuthenticationRequired should end cycle respx.get("/api/v1/production").mock().side_effect = [ httpx.NetworkError("Test timeoutexception"), EnvoyAuthenticationRequired("Test timeoutexception"), httpx.NetworkError, ] with pytest.raises(EnvoyAuthenticationRequired): await envoy.update() stats = envoy.request.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 2 # test EndOfStream catch should end retries respx.get("/api/v1/production").mock().side_effect = [ httpx.NetworkError("Test timeoutexception"), EndOfStream("Test timeoutexception"), httpx.NetworkError, ] with pytest.raises(EnvoyCommunicationError): await envoy.update() stats = envoy.request.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 2 @pytest.mark.asyncio @respx.mock async def test_bad_request_status_7_6_175_standard(): """Test request status not between 200-300.""" logging.getLogger("pyenphase").setLevel(logging.DEBUG) version = "7.6.175_standard" start_7_firmware_mock() prep_envoy(version, info=True) envoy = Envoy("127.0.0.1") envoy._firmware._get_info.retry.wait = wait_none() envoy._firmware._get_info.retry.stop = stop_after_attempt(3) | stop_after_delay(50) await envoy.setup() await envoy.authenticate("username", "password") data = await envoy.update() assert data # force status 503 on /api/vi/production # test status results in EnvoyHTTPStatusError respx.get("/api/v1/production").mock(return_value=Response(503)) with pytest.raises(EnvoyHTTPStatusError): await envoy.update() stats = envoy.request.retry.statistics assert "attempt_number" in stats assert stats["attempt_number"] == 1