{"id":16237159,"url":"https://github.com/klaasnicolaas/python-powerfox","last_synced_at":"2026-03-11T13:13:14.453Z","repository":{"id":220983402,"uuid":"556232232","full_name":"klaasnicolaas/python-powerfox","owner":"klaasnicolaas","description":"⚡ Asynchronous Python client for the Powerfox devices","archived":false,"fork":false,"pushed_at":"2026-03-03T00:51:13.000Z","size":2503,"stargazers_count":1,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-03T03:49:44.196Z","etag":null,"topics":["api","async","client","cloud","hacktoberfest","python"],"latest_commit_sha":null,"homepage":"https://www.powerfox.energy","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/klaasnicolaas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"klaasnicolaas","ko_fi":"klaasnicolaas"}},"created_at":"2022-10-23T11:28:57.000Z","updated_at":"2026-03-03T00:51:15.000Z","dependencies_parsed_at":"2024-04-15T00:24:00.487Z","dependency_job_id":"d79717de-f379-4fa8-89df-dc3f5bdbbdc7","html_url":"https://github.com/klaasnicolaas/python-powerfox","commit_stats":null,"previous_names":["klaasnicolaas/python-powerfox"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/klaasnicolaas/python-powerfox","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaasnicolaas%2Fpython-powerfox","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaasnicolaas%2Fpython-powerfox/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaasnicolaas%2Fpython-powerfox/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaasnicolaas%2Fpython-powerfox/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/klaasnicolaas","download_url":"https://codeload.github.com/klaasnicolaas/python-powerfox/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaasnicolaas%2Fpython-powerfox/sbom","scorecard":{"id":1240679,"data":{"date":"2025-12-23T04:32:54Z","repo":{"name":"github.com/klaasnicolaas/python-powerfox","commit":"d5f3f7ff0068f08bfe9795cb8358e7948aef1183"},"scorecard":{"version":"v5.3.0","commit":"c22063e786c11f9dd714d777a687ff7c4599b600"},"score":7.6,"checks":[{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#binary-artifacts"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: RenovateBot: .github/renovate.json:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dependency-update-tool"}},{"name":"Code-Review","score":0,"reason":"Found 0/22 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/pr-labels.yaml:23","Info: jobLevel 'pull-requests' permission set to 'read': .github/workflows/pr-labels.yaml:24","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release-drafter.yaml:19","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release.yaml:23","Info: jobLevel 'contents' permission set to 'read': .github/workflows/sync-labels.yaml:21","Info: jobLevel 'contents' permission set to 'read': .github/workflows/typing.yaml:21","Info: topLevel 'contents' permission set to 'read': .github/workflows/dependency-review.yaml:8","Info: topLevel 'contents' permission set to 'read': .github/workflows/linting.yaml:14","Info: topLevel 'contents' permission set to 'read': .github/workflows/lock.yaml:11","Info: topLevel 'contents' permission set to 'read': .github/workflows/pr-labels.yaml:16","Info: topLevel 'contents' permission set to 'read': .github/workflows/release-drafter.yaml:12","Info: topLevel 'contents' permission set to 'read': .github/workflows/release.yaml:15","Info: topLevel permissions set to 'read-all': .github/workflows/scoreboard.yaml:19","Info: topLevel 'contents' permission set to 'read': .github/workflows/stale.yaml:11","Info: topLevel 'contents' permission set to 'read': .github/workflows/sync-labels.yaml:14","Info: topLevel 'contents' permission set to 'read': .github/workflows/tests.yaml:14","Info: topLevel 'contents' permission set to 'read': .github/workflows/typing.yaml:14"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":10,"reason":"all dependencies are pinned","details":["Info:  29 out of  29 GitHub-owned GitHubAction dependencies pinned","Info:   8 out of   8 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":4,"reason":"security policy file detected","details":["Info: security policy file detected: .github/SECURITY.md:1","Warn: no linked content found","Info: Found disclosure, vulnerability, and/or timelines in security policy: .github/SECURITY.md:1","Info: Found text in security policy: .github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#vulnerabilities"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#cii-best-practices"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#signed-releases"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release.yaml:18"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#packaging"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: all commits (30) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#sast"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#fuzzing"}},{"name":"Contributors","score":10,"reason":"project has 6 contributing companies or organizations","details":["Info: found contributions from: NIPKaart, RotorHazard, dutchdronesquad, home-assistant, mrgreenboutiqueoffices, student-techlife"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#contributors"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'main'","Warn: 'stale review dismissal' is disabled on branch 'main'","Warn: branch 'main' does not require approvers","Info: codeowner review is required on branch 'main'","Warn: 'last push approval' is disabled on branch 'main'","Warn: 'up-to-date branches' is disabled on branch 'main'","Info: status check found to merge onto on branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#branch-protection"}},{"name":"CI-Tests","score":10,"reason":"30 out of 30 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#ci-tests"}}]},"last_synced_at":"2025-12-23T12:58:33.155Z","repository_id":220983402,"created_at":"2025-12-23T12:58:33.163Z","updated_at":"2025-12-23T12:58:33.163Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30382556,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-11T12:49:11.341Z","status":"ssl_error","status_checked_at":"2026-03-11T12:46:41.342Z","response_time":84,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","async","client","cloud","hacktoberfest","python"],"created_at":"2024-10-10T13:34:41.809Z","updated_at":"2026-03-11T13:13:14.440Z","avatar_url":"https://github.com/klaasnicolaas.png","language":"Python","funding_links":["https://github.com/sponsors/klaasnicolaas","https://ko-fi.com/klaasnicolaas"],"categories":[],"sub_categories":[],"readme":"\u003c!-- Banner --\u003e\n![alt Banner of the Powerfox package](https://raw.githubusercontent.com/klaasnicolaas/python-powerfox/main/assets/header_powerfox-min.png)\n\n\u003c!-- PROJECT SHIELDS --\u003e\n[![GitHub Release][releases-shield]][releases]\n[![Python Versions][python-versions-shield]][pypi]\n![Project Stage][project-stage-shield]\n![Project Maintenance][maintenance-shield]\n[![License][license-shield]](LICENSE)\n\n[![GitHub Activity][commits-shield]][commits-url]\n[![PyPi Downloads][downloads-shield]][downloads-url]\n[![GitHub Last Commit][last-commit-shield]][commits-url]\n[![Open in Dev Containers][devcontainer-shield]][devcontainer]\n\n[![Build Status][build-shield]][build-url]\n[![Typing Status][typing-shield]][typing-url]\n[![Code Coverage][codecov-shield]][codecov-url]\n[![OpenSSF Scorecard][scorecard-shield]][scorecard-url]\n\nAsynchronous Python client for [Powerfox][poweropti] devices (poweropti's).\n\n## About\n\nA python package with which you can read the data from a [poweropti][poweropti]\ndevice, via your Powerfox account (cloud polling) or directly from the local network\n(local polling). [Powerfox][powerfox] has various poweropti devices on the market\nthat you can use with a power, heat and water meter.\n\n## Installation\n\n```bash\npip install powerfox\n```\n\n## Poweropti devices\n\nNot all Poweropti devices are supported currently. Check the list below to see if your\ndevice is working with this package. Or help us by testing a device and let us know if\nit works.\n\n| Device                | Type        | Cloud        | Local |\n| --------------------- | ----------- | ------------ | ----- |\n| PA 201901 / PA 201902 | Power meter | Yes          | Yes   |\n| PB 202001             | Power meter | Yes          | Yes   |\n| WA 201902             | Water meter | Yes          | No    |\n| Powerfox FLOW         | Gas meter   | Yes (report) | No    |\n| HA 201902             | Heat meter  | Yes          | No    |\n\n## Datasets\n\n### Cloud API\n\n- `Powerfox.all_devices()` lists all devices linked to your account.\n- `Powerfox.device(...)` gives the realtime snapshot for a Poweropti device.\n- `Powerfox.report(...)` exposes hourly/daily blocks such as FLOW gas consumption.\n\n### Local API\n\n- `PowerfoxLocal.value()` retrieves real-time measurement data directly from the device.\n\n### Device inventory (`all_devices`)\n\nUse `Powerfox.all_devices()` to fetch the list of Poweropti devices linked to your\naccount. This endpoint is independent from the realtime `/current` data.\n\n| Field           | Type         | Description                                    |\n| :-------------- | :----------- | :--------------------------------------------- |\n| `device_id`     | `str`        | Unique identifier of the device.               |\n| `name`          | `str`        | Friendly name configured in the app.           |\n| `date_added`    | `datetime`   | When the device was linked to your account.    |\n| `main_device`   | `bool`       | Whether this is the main device in the portal. |\n| `bidirectional` | `bool`       | True for prosumer/power meters with feed-in.   |\n| `type`          | `DeviceType` | Division value (`device.type.human_readable`). |\n\n### Realtime device data (`device`)\n\nThis route powers all non-FLOW devices. The Powerfox FLOW gas meter does not expose a\n`/current` payload, so use the report dataset described below.\n\n\u003cdetails\u003e\n  \u003csummary\u003eRealtime dataset details (click to expand)\u003c/summary\u003e\n\n#### Power meter snapshot\n\n| Field                      | Type       | Unit | Description                                   |\n| :------------------------- | :--------- | :--- | :-------------------------------------------- |\n| `outdated`                 | `bool`     | -    | Data freshness indicator from Powerfox.       |\n| `timestamp`                | `datetime` | -    | Timestamp of the snapshot.                    |\n| `power`                    | `int`      | W    | Instant power draw.                           |\n| `energy_usage`             | `float`    | kWh  | Grid import since last reset (`None` if zero). |\n| `energy_return`            | `float`    | kWh  | Grid export since last reset (`None` if zero). |\n| `energy_usage_high_tariff` | `float`    | kWh  | High tariff import (optional).                |\n| `energy_usage_low_tariff`  | `float`    | kWh  | Low tariff import (optional).                 |\n\n#### Water meter snapshot\n\n| Field       | Type       | Unit | Description                |\n| :---------- | :--------- | :--- | :------------------------- |\n| `outdated`  | `bool`     | -    | Data freshness indicator.  |\n| `timestamp` | `datetime` | -    | Timestamp of the snapshot. |\n| `cold_water`| `float`    | m³   | Total cold water usage.    |\n| `warm_water`| `float`    | m³   | Total warm water usage.    |\n\n#### Heat meter snapshot\n\n| Field         | Type       | Unit | Description                                |\n| :------------ | :--------- | :--- | :----------------------------------------- |\n| `outdated`    | `bool`     | -    | Data freshness indicator.                  |\n| `timestamp`   | `datetime` | -    | Timestamp of the snapshot.                 |\n| `total_energy`| `int`      | kWh  | Total consumed energy.                     |\n| `delta_energy`| `int`      | kWh  | Consumption delta since previous reading.  |\n| `total_volume`| `float`    | m³   | Total volume (heating circuit).            |\n| `delta_volume`| `float`    | m³   | Volume delta since previous reading.       |\n\n\u003c/details\u003e\n\n### Report data (`report`)\n\n`Powerfox.report(device_id, *, year=None, month=None, day=None)` exposes the\n`my/{device_id}/report` endpoint and returns a `DeviceReport` composed of optional\nsections. When no filters are provided the last 24 hours are returned. `month` requires\n`year`, and `day` requires both `year` and `month`.\n\n\u003cdetails\u003e\n  \u003csummary\u003eReport dataset details (click to expand)\u003c/summary\u003e\n\n#### FLOW gas meter (`GasReport`)\n\n| Field                  | Unit           | Description                                                                |\n| :--------------------- | :------------- | :------------------------------------------------------------------------- |\n| `sum` / `total_delta`  | m³ / impulses  | Total gas consumption for the window.                                      |\n| `consumption`          | m³             | Consumption for the period (identical to `sum`).                           |\n| `consumption_kwh`      | kWh            | Consumption converted to kWh (requires tariff).                            |\n| `current_consumption`  | m³             | Current FLOW reading from the report payload.                              |\n| `avg_delta`, `min`, `max` | m³         | Aggregated hourly min/max/average consumption.                             |\n| `avg_consumption_kwh` etc. | kWh       | Same aggregates in kWh.                                                    |\n| `sum_currency`, `max_currency` | €     | Currency values when a tariff is configured.                               |\n| `report_values`        | -              | List of `ReportValue` entries (hourly blocks).                             |\n\n#### Power/Heat/Water history (`EnergyReport`)\n\n| Field        | Unit        | Description                                         |\n| :----------- | :---------- | :-------------------------------------------------- |\n| `start_time` | `datetime`  | Start of the returned time series.                  |\n| `sum`        | kWh / m³    | Total consumption for the requested window.         |\n| `max`        | kWh / m³    | Maximum hourly/daily value in the window.           |\n| `sum_currency` | €         | Optional total cost (requires tariff).              |\n| `report_values` | -        | List of `ReportValue` entries (hourly/daily deltas). |\n\n#### ReportValue entries\n\nEach element in `report_values` represents an hourly (or daily) block.\n\n| Field                 | Unit        | Description                                                  |\n| :-------------------- | :---------- | :----------------------------------------------------------- |\n| `timestamp`           | `datetime`  | Start time of the block (UTC).                               |\n| `delta` / `consumption` | kWh / m³  | Consumption for that block.                                  |\n| `delta_ht` / `delta_nt` | kWh       | Tariff specific deltas for power meters.                     |\n| `delta_currency`      | €           | Cost for the block (requires tariff).                        |\n| `total_delta`         | impulses/m³ | Aggregate impulse count when provided (FLOW).                |\n| `current_consumption` | kWh / m³    | Current instantaneous reading if the API includes it.        |\n| `values_type`         | int         | Distinguishes consumption (`1`) vs feed-in (`2`).            |\n\n\u003c/details\u003e\n\nUse `Powerfox.report(device_id, *, year=None, month=None, day=None)` to retrieve the\nhourly or daily datasets from the `my/{device_id}/report` endpoint. This method powers\nthe Powerfox FLOW gas meter support and can also be used for historic consumption or\nfeed-in data for other devices. The response is parsed into a `DeviceReport`\ndataclass, which may contain:\n\n- `gas`: a `GasReport` section with FLOW totals and hourly consumption.\n- `consumption`: consumption data for power meters.\n- `feed_in`: feed-in data for bidirectional meters.\n\nThe `month` parameter requires `year`, and `day` requires both `year` and `month`. When\nno parameters are given the API returns the last 24 hours.\n\n### Local interface data (`value`)\n\nThe local interface is available on poweropti devices (PA201901, PA201902, PB202001)\nwith firmware v2.02.07+ and the powerfox PRO Service enabled. It provides real-time\nmeasurement data over HTTP in the local network.\n\n| Field                      | Type       | Unit | Description                                     |\n| :------------------------- | :--------- | :--- | :---------------------------------------------- |\n| `timestamp`                | `datetime` | -    | Timestamp of the measurement (UTC).             |\n| `power`                    | `int`      | W    | Instantaneous power (positive=import, negative=export). |\n| `energy_usage`             | `int`      | Wh   | Total grid import meter reading.                |\n| `energy_usage_high_tariff` | `int`      | Wh   | Grid import tariff register 1.                  |\n| `energy_usage_low_tariff`  | `int`      | Wh   | Grid import tariff register 2.                  |\n| `energy_return`            | `int`      | Wh   | Total grid export meter reading.                |\n\n### Examples\n\n#### Cloud API\n\n```python\nimport asyncio\n\nfrom powerfox import Powerfox\n\n\nasync def main() -\u003e None:\n    \"\"\"Show example on using this package.\"\"\"\n    async with Powerfox(\n        username=\"EMAIL_ADDRESS\",\n        password=\"PASSWORD\",\n    ) as client:\n        devices = await client.all_devices()\n        print(devices)\n\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n```\n\n#### Local API\n\n```python\nimport asyncio\n\nfrom powerfox import PowerfoxLocal\n\n\nasync def main() -\u003e None:\n    \"\"\"Show example on getting data from a local poweropti.\"\"\"\n    async with PowerfoxLocal(\n        host=\"IP_ADDRESS\",\n        api_key=\"DEVICE_ID\",\n    ) as client:\n        value = await client.value()\n        print(value)\n\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n```\n\nMore examples can be found in the [examples folder](./examples/).\n\n### Class Parameters\n\n#### Powerfox (cloud)\n\n| Parameter | value Type | Description |\n| :-------- | :--------- | :---------- |\n| `username` | `str` | The email address of your Powerfox account. |\n| `password` | `str` | The password of your Powerfox account. |\n\n#### PowerfoxLocal (local)\n\n| Parameter | value Type | Description |\n| :-------- | :--------- | :---------- |\n| `host` | `str` | IP address or hostname of the poweropti device. |\n| `api_key` | `str` | The API key (default: the 12-character device ID). |\n\n\u003e [!TIP]\n\u003e The `api_key` is initially your device ID (e.g. `1097bd725557`). You can find it\n\u003e on the sticker on your poweropti, in the powerfox app under device settings, or\n\u003e programmatically via `Powerfox.all_devices()` (the `id` field).\n\n## Contributing\n\nThis is an active open-source project. We are always open to people who want to\nuse the code or contribute to it.\n\nWe've set up a separate document for our\n[contribution guidelines](CONTRIBUTING.md).\n\nThank you for being involved! :heart_eyes:\n\n## Setting up development environment\n\nThe simplest way to begin is by utilizing the [Dev Container][devcontainer]\nfeature of Visual Studio Code or by opening a CodeSpace directly on GitHub.\nBy clicking the button below you immediately start a Dev Container in Visual Studio Code.\n\n[![Open in Dev Containers][devcontainer-shield]][devcontainer]\n\nThis Python project relies on [Poetry][poetry] as its dependency manager,\nproviding comprehensive management and control over project dependencies.\n\nYou need at least:\n\n- Python 3.12+\n- [Poetry][poetry-install]\n\n### Installation\n\nInstall all packages, including all development requirements:\n\n```bash\npoetry install\n```\n\n_Poetry creates by default an virtual environment where it installs all\nnecessary pip packages_.\n\n### Prek\n\nThis repository uses the [prek][prek] framework, all changes\nare linted and tested with each commit. To setup the prek check, run:\n\n```bash\npoetry run prek install\n```\n\nAnd to run all checks and tests manually, use the following command:\n\n```bash\npoetry run prek run --all-files\n```\n\n### Testing\n\nIt uses [pytest](https://docs.pytest.org/en/stable/) as the test framework. To run the tests:\n\n```bash\npoetry run pytest\n```\n\nTo update the [syrupy](https://github.com/tophat/syrupy) snapshot tests:\n\n```bash\npoetry run pytest --snapshot-update\n```\n\n## License\n\nMIT License\n\nCopyright (c) 2025-2026 Klaas Schoute\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\u003c!-- LINKS FROM PLATFORM --\u003e\n[powerfox]: https://www.powerfox.energy\n[poweropti]: https://shop.powerfox.energy/collections/frontpage\n\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n[build-shield]: https://github.com/klaasnicolaas/python-powerfox/actions/workflows/tests.yaml/badge.svg\n[build-url]: https://github.com/klaasnicolaas/python-powerfox/actions/workflows/tests.yaml\n[codecov-shield]: https://codecov.io/gh/klaasnicolaas/python-powerfox/branch/main/graph/badge.svg?token=GWI54W3CG9\n[codecov-url]: https://codecov.io/gh/klaasnicolaas/python-powerfox\n[commits-shield]: https://img.shields.io/github/commit-activity/y/klaasnicolaas/python-powerfox.svg\n[commits-url]: https://github.com/klaasnicolaas/python-powerfox/commits/main\n[devcontainer-shield]: https://img.shields.io/static/v1?label=Dev%20Containers\u0026message=Open\u0026color=blue\u0026logo=visualstudiocode\n[devcontainer]: https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/klaasnicolaas/python-powerfox\n[downloads-shield]: https://img.shields.io/pypi/dm/powerfox\n[downloads-url]: https://pypistats.org/packages/powerfox\n[last-commit-shield]: https://img.shields.io/github/last-commit/klaasnicolaas/python-powerfox.svg\n[license-shield]: https://img.shields.io/github/license/klaasnicolaas/python-powerfox.svg\n[maintenance-shield]: https://img.shields.io/maintenance/yes/2026.svg\n[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg\n[pypi]: https://pypi.org/project/powerfox/\n[python-versions-shield]: https://img.shields.io/pypi/pyversions/powerfox\n[releases-shield]: https://img.shields.io/github/release/klaasnicolaas/python-powerfox.svg\n[releases]: https://github.com/klaasnicolaas/python-powerfox/releases\n[scorecard-shield]: https://api.scorecard.dev/projects/github.com/klaasnicolaas/python-powerfox/badge\n[scorecard-url]: https://scorecard.dev/viewer/?uri=github.com/klaasnicolaas/python-powerfox\n[typing-shield]: https://github.com/klaasnicolaas/python-powerfox/actions/workflows/typing.yaml/badge.svg\n[typing-url]: https://github.com/klaasnicolaas/python-powerfox/actions/workflows/typing.yaml\n\n[poetry-install]: https://python-poetry.org/docs/#installation\n[poetry]: https://python-poetry.org\n[prek]: https://github.com/j178/prek\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklaasnicolaas%2Fpython-powerfox","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fklaasnicolaas%2Fpython-powerfox","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklaasnicolaas%2Fpython-powerfox/lists"}