Repository: plugwise/python-plugwise (language: python)

Issue:
Enable ruff formatting


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
	- Enhanced data handling for thermostat entities in the legacy data management system.
	- Introduced a new test for handling errors in legacy systems.

- **Bug Fixes**
	- Improved error handling and clarity in various methods across the codebase.

- **Documentation**
	- Updated project metadata, including version number and author information.

- **Refactor**
	- Enhanced readability and maintainability of code through formatting adjustments and clearer error messages.

- **Tests**
	- Adjusted formatting of test method calls for better clarity.
	- Added new test cases to validate error handling scenarios.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Discussion / hints:
<!-- This is an auto-generated comment: summarize by coderabbit.ai -->




<!-- walkthrough_start -->

## Walkthrough
The changes introduced in this pull request focus on enhancing the readability and maintainability of the Plugwise codebase. Key modifications include updates to method signatures, error handling improvements, and formatting adjustments across various files. The `Smile` and `SmileLegacyAPI` classes have been refined for clarity, while constants and data structures have been organized better. Additionally, the project metadata in `pyproject.toml` has been updated, and the testing scripts have been modified to improve linting processes.

## Changes

| File Path                        | Change Summary |
|----------------------------------|----------------|
| `plugwise/__init__.py`          | Updated `Smile` class with structured initialization, improved error handling in multiple methods, and minor formatting adjustments. Method signatures updated for clarity. |
| `plugwise/common.py`            | Refined method signatures and formatting in `SmileCommon` class for better readability. |
| `plugwise/constants.py`          | Organized constants and data structures, applied `Final` type hints, and made minor formatting changes. |
| `plugwise/data.py`              | Reformatted conditional statements in `SmileData` class for better readability. Adjusted method signature formatting. |
| `plugwise/helper.py`            | Improved formatting of multi-line strings and error handling in methods. |
| `plugwise/legacy/data.py`       | Enhanced `_get_entity_data` and `_climate_data` methods in `SmileLegacyData` class for better handling of thermostat data. |
| `plugwise/legacy/helper.py`     | Minor formatting changes for readability in `SmileLegacyHelper` class. |
| `plugwise/legacy/smile.py`      | Improved formatting in `SmileLegacyAPI` methods without changing functionality. |
| `plugwise/smile.py`             | Updated `SmileAPI` class with type hints, improved error handling, and reformatted method signatures. |
| `plugwise/util.py`              | Simplified condition checks for clarity without altering functionality. |
| `pyproject.toml`                | Updated project version, classifiers, authors, maintainers, and modified linting rules. |
| `scripts/tests_and_coverage.sh` | Enhanced linting process by adding `ruff` formatting command. |
| `tests/test_adam.py`            | Reformatted assertions and method calls for better readability. |
| `tests/test_anna.py`            | Adjusted formatting of `await self.device_test` calls for clarity. |
| `tests/test_generic.py`         | Focused on testing error scenarios in connection attempts with no logic changes. |
| `tests/test_init.py`            | Improved exception handling formatting and removed unnecessary line breaks. |
| `tests/test_legacy_anna.py`     | Reformatted `self.device_test` call for better readability. |
| `tests/test_legacy_generic.py`  | Added new test method for legacy system error handling and reformatted class definition. |
| `tests/test_legacy_stretch.py`  | Minor formatting changes in class declaration and method calls for clarity. |

## Possibly related PRs
- **#621**: This PR focuses on enhancing the linting process and code quality, which indirectly relates to the main PR's emphasis on improving code readability and organization.
- **#630**: This PR involves changes to device classifications and JSON structures, which may relate to the overall organization and clarity of the codebase, similar to the main PR's focus on code clarity.
- **#635**: This PR updates the project version and reflects ongoing development, which aligns with the main PR's objective of improving code maintainability.
- **#651**: This PR addresses bug fixes related to device recognition, which could be relevant to the main PR's focus on enhancing functionality and error handling.
- **#659**: This PR improves control state processing, which is directly related to the changes made in the main PR regarding error handling and method updates.
- **#661**: This PR adds a new binary sensor for cooling functionality, which is relevant to the main PR's focus on enhancing the functionality and clarity of the code related to device states.

## Suggested labels
`enhancement`, `dependencies`

## Suggested reviewers
- CoMPaTech

## Poem
> In the code where rabbits play,  
> Enhancements hop in bright array.  
> With clearer paths and errors tamed,  
> The Plugwise world is now acclaimed.  
> So let us cheer with joyful glee,  
> For readability, we now decree! 🐇✨

<!-- walkthrough_end -->

---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 82876318e313d92d2c0290501b2f986802d81d6c and 722a69b153f434c4280ba5c12083f5035bb6a4e8.

</details>

<details>
<summary>📒 Files selected for processing (18)</summary>

* `plugwise/__init__.py` (10 hunks)
* `plugwise/common.py` (7 hunks)
* `plugwise/constants.py` (2 hunks)
* `plugwise/data.py` (7 hunks)
* `plugwise/helper.py` (13 hunks)
* `plugwise/legacy/data.py` (1 hunks)
* `plugwise/legacy/helper.py` (6 hunks)
* `plugwise/legacy/smile.py` (4 hunks)
* `plugwise/smile.py` (6 hunks)
* `plugwise/util.py` (4 hunks)
* `scripts/tests_and_coverage.sh` (1 hunks)
* `tests/test_adam.py` (4 hunks)
* `tests/test_anna.py` (3 hunks)
* `tests/test_generic.py` (1 hunks)
* `tests/test_init.py` (13 hunks)
* `tests/test_legacy_anna.py` (1 hunks)
* `tests/test_legacy_generic.py` (1 hunks)
* `tests/test_legacy_stretch.py` (2 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (18)</summary>

* tests/test_legacy_anna.py
* plugwise/util.py
* scripts/tests_and_coverage.sh
* tests/test_anna.py
* tests/test_adam.py
* plugwise/helper.py
* tests/test_generic.py
* tests/test_init.py
* plugwise/constants.py
* tests/test_legacy_stretch.py
* tests/test_legacy_generic.py
* plugwise/legacy/helper.py
* plugwise/data.py
* plugwise/legacy/data.py
* plugwise/legacy/smile.py
* plugwise/smile.py
* plugwise/common.py
* plugwise/__init__.py

</details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` or `@coderabbitai title` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

Fix patch:
diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml
index d2bbda5d7..a05c423bd 100644
--- a/.github/workflows/verify.yml
+++ b/.github/workflows/verify.yml
@@ -4,7 +4,7 @@
 name: Latest commit
 
 env:
-  CACHE_VERSION: 11
+  CACHE_VERSION: 12
   DEFAULT_PYTHON: "3.13.0"
   PRE_COMMIT_HOME: ~/.cache/pre-commit
 
@@ -98,12 +98,12 @@ jobs:
       - name: Ruff (with fix)
         run: |
           . venv/bin/activate
-          ruff check --fix plugwise/*py tests/*py
+          ruff check plugwise/ tests/
       - name: If needed, commit ruff changes to the pull request
         if: failure()
         run: |
           . venv/bin/activate
-          ruff check --fix plugwise/*py tests/*py
+          ruff format plugwise/ tests/
           git config --global user.name 'autoruff'
           git config --global user.email 'plugwise@users.noreply.github.com'
           git remote set-url origin https://x-access-token:${{ secrets.PAT_CT }}@github.com/$GITHUB_REPOSITORY
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 0f9535f98..155621c48 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,9 +1,3 @@
-ci:
-  # Defer autoupdate to quarterly (there is no 'off' button) to have renovate pick up first
-  autoupdate_schedule: quarterly
-  skip: [setup, setup_test, pylint, markdownlint, testing, biome]
-  submodules: true
-
 default_language_version:
   # force all unspecified python hooks to run python3
   python: python3.13
@@ -14,31 +8,39 @@ repos:
     rev: v0.8.2
     hooks:
       - id: ruff
+        name: "Ruff check"
         args:
           - --fix
+      - id: ruff-format
+        name: "Ruff format"
   - repo: https://github.com/pre-commit/pre-commit-hooks
     rev: v5.0.0
     hooks:
       - id: check-executables-have-shebangs
+        name: "Check scripts"
         stages: [manual]
       - id: no-commit-to-branch
+        name: "Check branch"
         args:
           - --branch=main
   - repo: https://github.com/asottile/pyupgrade
     rev: v3.19.0
     hooks:
       - id: pyupgrade
-        args: [--py39-plus]
+        name: "Check Py upgrade"
+        args: [--py311-plus]
   #  Moved codespell configuration to setup.cfg as per 'all-files' issues not reading args
   - repo: https://github.com/codespell-project/codespell
     rev: v2.3.0
     hooks:
       - id: codespell
+        name: "Check spelling"
         exclude_types: [csv, json]
   - repo: https://github.com/PyCQA/bandit
     rev: 1.8.0
     hooks:
       - id: bandit
+        name: "Bandit checking"
         args:
           - --quiet
           - --format=custom
@@ -48,6 +50,7 @@ repos:
     rev: v1.35.1
     hooks:
       - id: yamllint
+        name: "YAML linting"
   - repo: https://github.com/cdce8p/python-typing-update
     rev: v0.7.0
     hooks:
@@ -55,6 +58,7 @@ repos:
       # to update python typing syntax.
       # Will require manual work, before submitting changes!
       - id: python-typing-update
+        name: "Python typing"
         stages: [manual]
         args:
           - --py39-plus
@@ -68,41 +72,41 @@ repos:
       # committing from a GUI tool that was not launched from an activated
       # shell.
       - id: setup
-        name: Setup python
+        name: "Setup"
         entry: /usr/bin/env bash -c 'test -d ./venv || scripts/setup.sh'
         language: script
       - id: setup_test
-        name: Setup testing
+        name: "Setup (extended for testing"
         entry: /usr/bin/env bash -c 'test -f ./tmp/biome || scripts/setup_test.sh pre-commit'
         language: script
       - id: userdata
-        name: userdata
+        name: "Validating userdata"
         entry: scripts/pre-commit.sh
         language: script
         types: [python]
         pass_filenames: false
       - id: mypy
-        name: mypy
+        name: "Running MyPy"
         entry: scripts/run-in-env.sh mypy
         language: script
         types: [python]
         require_serial: true
         files: ^plugwise/$
       - id: pylint
-        name: pylint
+        name: "PyLinting"
         entry: scripts/run-in-env.sh pylint -j 0
         language: script
         types: [python]
         files: ^plugwise/.+\.py$
       - id: testing
-        name: "Local Testing - Performing Tests"
+        name: "Performing Tests"
         # yamllint disable-line rule:line-length
-        entry: /usr/bin/env bash -c 'exec env GITHUB_ACTIONS="1" scripts/tests_and_coverage.sh test_and_coverage'
+        entry: /usr/bin/env bash -c 'exec env GITHUB_ACTIONS="1" NO_FIXTURES="1" scripts/tests_and_coverage.sh test_and_coverage'
         language: script
         pass_filenames: false
       - id: biome
-        name: "Local Linting - Biome"
-        entry: ./tmp/biome lint --staged --files-ignore-unknown=true --no-errors-on-unmatched
+        name: "Biome (prettier)"
+        entry: ./tmp/biome check fixtures/ plugwise/ tests/ --files-ignore-unknown=true --no-errors-on-unmatched --json-formatter-indent-width=2 --json-formatter-indent-style=space
         language: script
   - repo: https://github.com/igorshubovych/markdownlint-cli
     rev: v0.43.0
diff --git a/fixtures/adam_heatpump_cooling/all_data.json b/fixtures/adam_heatpump_cooling/all_data.json
index 4b0e13cbe..8c7e1667e 100644
--- a/fixtures/adam_heatpump_cooling/all_data.json
+++ b/fixtures/adam_heatpump_cooling/all_data.json
@@ -13,13 +13,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Slaapkamer SJ",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -33,9 +27,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "d3a276aeb3114a509bab1e4bf8c40348"
-        ],
+        "primary": ["d3a276aeb3114a509bab1e4bf8c40348"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -139,13 +131,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Slaapkamer DB",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -159,9 +145,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "47e2c550a33846b680725aa3fb229473"
-        ],
+        "primary": ["47e2c550a33846b680725aa3fb229473"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -261,13 +245,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Badkamer 2",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "Werkdag schema",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -280,9 +258,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "f04c985c11ad4848b8fcd710343f9dcf"
-        ],
+        "primary": ["f04c985c11ad4848b8fcd710343f9dcf"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -313,11 +289,7 @@
       },
       "dev_class": "gateway",
       "firmware": "3.2.8",
-      "gateway_modes": [
-        "away",
-        "full",
-        "vacation"
-      ],
+      "gateway_modes": ["away", "full", "vacation"],
       "hardware": "AME Smile 2.0 board",
       "location": "eedadcb297564f1483faa509179aebed",
       "mac_address": "012345670001",
@@ -414,13 +386,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Badkamer 1",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "Werkdag schema",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -434,9 +400,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "eac5db95d97241f6b17790897847ccf5"
-        ],
+        "primary": ["eac5db95d97241f6b17790897847ccf5"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -454,13 +418,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Slaapkamer RB",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 3.13,
@@ -473,9 +431,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "c4ed311d54e341f58b4cdd201d1fde7e"
-        ],
+        "primary": ["c4ed311d54e341f58b4cdd201d1fde7e"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -513,13 +469,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Slaapkamer SQ",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -533,9 +483,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "beb32da072274e698146db8b022f3c36"
-        ],
+        "primary": ["beb32da072274e698146db8b022f3c36"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -573,13 +521,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Keuken",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "Werkdag schema",
       "sensors": {
         "electricity_consumed": 2.13,
@@ -593,9 +535,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "ea8372c0e3ad4622ad45a041d02425f5"
-        ],
+        "primary": ["ea8372c0e3ad4622ad45a041d02425f5"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -613,13 +553,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Bijkeuken",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -633,9 +567,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "1053c8bbf8be43c6921742b146a625f1"
-        ],
+        "primary": ["1053c8bbf8be43c6921742b146a625f1"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -751,13 +683,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Slaapkamer JM",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -771,9 +697,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "7fda9f84f01342f8afe9ebbbbff30c0f"
-        ],
+        "primary": ["7fda9f84f01342f8afe9ebbbbff30c0f"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -861,13 +785,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Woonkamer",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "Werkdag schema",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -881,9 +799,7 @@
         "upper_bound": 35.0
       },
       "thermostats": {
-        "primary": [
-          "ca79d23ae0094120b877558734cff85c"
-        ],
+        "primary": ["ca79d23ae0094120b877558734cff85c"],
         "secondary": []
       },
       "vendor": "Plugwise"
diff --git a/fixtures/adam_jip/all_data.json b/fixtures/adam_jip/all_data.json
index 3943394dd..1dfe021ac 100644
--- a/fixtures/adam_jip/all_data.json
+++ b/fixtures/adam_jip/all_data.json
@@ -7,13 +7,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Slaapkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "sensors": {
         "temperature": 24.2
       },
@@ -24,12 +18,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "1346fbd8498d4dbcab7e18d51b771f3d"
-        ],
-        "secondary": [
-          "356b65335e274d769c338223e7af9c33"
-        ]
+        "primary": ["1346fbd8498d4dbcab7e18d51b771f3d"],
+        "secondary": ["356b65335e274d769c338223e7af9c33"]
       },
       "vendor": "Plugwise"
     },
@@ -40,13 +30,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Woonkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "sensors": {
         "temperature": 27.4
       },
@@ -57,12 +41,8 @@
         "upper_bound": 30.0
       },
       "thermostats": {
-        "primary": [
-          "f61f1a2535f54f52ad006a3d18e459ca"
-        ],
-        "secondary": [
-          "833de10f269c4deab58fb9df69901b4e"
-        ]
+        "primary": ["f61f1a2535f54f52ad006a3d18e459ca"],
+        "secondary": ["833de10f269c4deab58fb9df69901b4e"]
       },
       "vendor": "Plugwise"
     },
@@ -239,23 +219,14 @@
       },
       "dev_class": "gateway",
       "firmware": "3.2.8",
-      "gateway_modes": [
-        "away",
-        "full",
-        "vacation"
-      ],
+      "gateway_modes": ["away", "full", "vacation"],
       "hardware": "AME Smile 2.0 board",
       "location": "9e4433a9d69f40b3aefd15e74395eaec",
       "mac_address": "012345670001",
       "model": "Gateway",
       "model_id": "smile_open_therm",
       "name": "Adam",
-      "regulation_modes": [
-        "heating",
-        "off",
-        "bleeding_cold",
-        "bleeding_hot"
-      ],
+      "regulation_modes": ["heating", "off", "bleeding_cold", "bleeding_hot"],
       "select_gateway_mode": "full",
       "select_regulation_mode": "heating",
       "sensors": {
@@ -271,13 +242,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Kinderkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "sensors": {
         "temperature": 30.0
       },
@@ -288,12 +253,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "6f3e9d7084214c21b9dfa46f6eeb8700"
-        ],
-        "secondary": [
-          "d4496250d0e942cfa7aea3476e9070d5"
-        ]
+        "primary": ["6f3e9d7084214c21b9dfa46f6eeb8700"],
+        "secondary": ["d4496250d0e942cfa7aea3476e9070d5"]
       },
       "vendor": "Plugwise"
     },
@@ -328,13 +289,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Logeerkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "sensors": {
         "temperature": 30.0
       },
@@ -345,12 +300,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "a6abc6a129ee499c88a4d420cc413b47"
-        ],
-        "secondary": [
-          "1da4d325838e4ad8aac12177214505c9"
-        ]
+        "primary": ["a6abc6a129ee499c88a4d420cc413b47"],
+        "secondary": ["1da4d325838e4ad8aac12177214505c9"]
       },
       "vendor": "Plugwise"
     },
diff --git a/fixtures/adam_multiple_devices_per_zone/all_data.json b/fixtures/adam_multiple_devices_per_zone/all_data.json
index 2adf14a27..4c8242b35 100644
--- a/fixtures/adam_multiple_devices_per_zone/all_data.json
+++ b/fixtures/adam_multiple_devices_per_zone/all_data.json
@@ -36,13 +36,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Badkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "Badkamer Schema",
       "sensors": {
         "temperature": 18.9
@@ -77,13 +71,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Bios",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -97,12 +85,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "df4a4a8169904cdb9c03d61a21f42140"
-        ],
-        "secondary": [
-          "a2c3583e0a6349358998b760cea82d2a"
-        ]
+        "primary": ["df4a4a8169904cdb9c03d61a21f42140"],
+        "secondary": ["a2c3583e0a6349358998b760cea82d2a"]
       },
       "vendor": "Plugwise"
     },
@@ -142,13 +126,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Garage",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "off",
       "sensors": {
         "temperature": 15.6
@@ -160,9 +138,7 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "e7693eb9582644e5b865dba8d4447cf1"
-        ],
+        "primary": ["e7693eb9582644e5b865dba8d4447cf1"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -298,13 +274,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Jessie",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "CV Jessie",
       "sensors": {
         "temperature": 17.2
@@ -316,12 +286,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "6a3bf693d05e48e0b460c815a4fdd09d"
-        ],
-        "secondary": [
-          "d3da73bde12a47d5a6b8f9dad971f2ec"
-        ]
+        "primary": ["6a3bf693d05e48e0b460c815a4fdd09d"],
+        "secondary": ["d3da73bde12a47d5a6b8f9dad971f2ec"]
       },
       "vendor": "Plugwise"
     },
@@ -453,13 +419,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Woonkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "GF7  Woonkamer",
       "sensors": {
         "electricity_consumed": 35.6,
@@ -473,12 +433,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "b59bcebaf94b499ea7d46e4a66fb62d8"
-        ],
-        "secondary": [
-          "b310b72a0e354bfab43089919b9a88bf"
-        ]
+        "primary": ["b59bcebaf94b499ea7d46e4a66fb62d8"],
+        "secondary": ["b310b72a0e354bfab43089919b9a88bf"]
       },
       "vendor": "Plugwise"
     },
diff --git a/fixtures/adam_onoff_cooling_fake_firmware/all_data.json b/fixtures/adam_onoff_cooling_fake_firmware/all_data.json
index 865b611d0..fba4e8168 100644
--- a/fixtures/adam_onoff_cooling_fake_firmware/all_data.json
+++ b/fixtures/adam_onoff_cooling_fake_firmware/all_data.json
@@ -43,11 +43,7 @@
       },
       "dev_class": "gateway",
       "firmware": "3.2.8",
-      "gateway_modes": [
-        "away",
-        "full",
-        "vacation"
-      ],
+      "gateway_modes": ["away", "full", "vacation"],
       "hardware": "AME Smile 2.0 board",
       "location": "eedadcb297564f1483faa509179aebed",
       "mac_address": "012345670001",
@@ -94,13 +90,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Woonkamer",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "Werkdag schema",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -114,9 +104,7 @@
         "upper_bound": 35.0
       },
       "thermostats": {
-        "primary": [
-          "ca79d23ae0094120b877558734cff85c"
-        ],
+        "primary": ["ca79d23ae0094120b877558734cff85c"],
         "secondary": []
       },
       "vendor": "Plugwise"
diff --git a/fixtures/adam_plus_anna/all_data.json b/fixtures/adam_plus_anna/all_data.json
index f92d7c949..1b2b11f71 100644
--- a/fixtures/adam_plus_anna/all_data.json
+++ b/fixtures/adam_plus_anna/all_data.json
@@ -2,22 +2,13 @@
   "devices": {
     "009490cc2f674ce6b576863fbb64f867": {
       "active_preset": "home",
-      "available_schedules": [
-        "Weekschema",
-        "off"
-      ],
+      "available_schedules": ["Weekschema", "off"],
       "climate_mode": "auto",
       "control_state": "idle",
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Living room",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "Weekschema",
       "sensors": {
         "electricity_consumed": 74.2,
@@ -31,9 +22,7 @@
         "upper_bound": 35.0
       },
       "thermostats": {
-        "primary": [
-          "ee62cad889f94e8ca3d09021f03a660b"
-        ],
+        "primary": ["ee62cad889f94e8ca3d09021f03a660b"],
         "secondary": []
       },
       "vendor": "Plugwise"
diff --git a/fixtures/adam_plus_anna_new/all_data.json b/fixtures/adam_plus_anna_new/all_data.json
index 5aafe2fb7..9e074f344 100644
--- a/fixtures/adam_plus_anna_new/all_data.json
+++ b/fixtures/adam_plus_anna_new/all_data.json
@@ -162,23 +162,14 @@
       },
       "dev_class": "gateway",
       "firmware": "3.7.8",
-      "gateway_modes": [
-        "away",
-        "full",
-        "vacation"
-      ],
+      "gateway_modes": ["away", "full", "vacation"],
       "hardware": "AME Smile 2.0 board",
       "location": "bc93488efab249e5bc54fd7e175a6f91",
       "mac_address": "012345679891",
       "model": "Gateway",
       "model_id": "smile_open_therm",
       "name": "Adam",
-      "regulation_modes": [
-        "bleeding_hot",
-        "bleeding_cold",
-        "off",
-        "heating"
-      ],
+      "regulation_modes": ["bleeding_hot", "bleeding_cold", "off", "heating"],
       "select_gateway_mode": "full",
       "select_regulation_mode": "heating",
       "sensors": {
@@ -240,13 +231,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Living room",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "home",
-        "away"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
       "select_schedule": "Weekschema",
       "sensors": {
         "electricity_consumed": 149.9,
@@ -260,9 +245,7 @@
         "upper_bound": 35.0
       },
       "thermostats": {
-        "primary": [
-          "ad4838d7d35c4d6ea796ee12ae5aedf8"
-        ],
+        "primary": ["ad4838d7d35c4d6ea796ee12ae5aedf8"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -281,13 +264,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Bathroom",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "home",
-        "away"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
       "select_schedule": "Badkamer",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -301,12 +278,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "e2f4322d57924fa090fbbc48b3a140dc"
-        ],
-        "secondary": [
-          "1772a4ea304041adb83f357b751341ff"
-        ]
+        "primary": ["e2f4322d57924fa090fbbc48b3a140dc"],
+        "secondary": ["1772a4ea304041adb83f357b751341ff"]
       },
       "vendor": "Plugwise"
     }
diff --git a/fixtures/adam_plus_anna_new_regulation_off/all_data.json b/fixtures/adam_plus_anna_new_regulation_off/all_data.json
index f713da3e9..8d447dc81 100644
--- a/fixtures/adam_plus_anna_new_regulation_off/all_data.json
+++ b/fixtures/adam_plus_anna_new_regulation_off/all_data.json
@@ -162,23 +162,14 @@
       },
       "dev_class": "gateway",
       "firmware": "3.7.8",
-      "gateway_modes": [
-        "away",
-        "full",
-        "vacation"
-      ],
+      "gateway_modes": ["away", "full", "vacation"],
       "hardware": "AME Smile 2.0 board",
       "location": "bc93488efab249e5bc54fd7e175a6f91",
       "mac_address": "012345679891",
       "model": "Gateway",
       "model_id": "smile_open_therm",
       "name": "Adam",
-      "regulation_modes": [
-        "bleeding_hot",
-        "bleeding_cold",
-        "off",
-        "heating"
-      ],
+      "regulation_modes": ["bleeding_hot", "bleeding_cold", "off", "heating"],
       "select_gateway_mode": "full",
       "select_regulation_mode": "off",
       "sensors": {
@@ -240,13 +231,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Living room",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "home",
-        "away"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 149.9,
@@ -260,9 +245,7 @@
         "upper_bound": 35.0
       },
       "thermostats": {
-        "primary": [
-          "ad4838d7d35c4d6ea796ee12ae5aedf8"
-        ],
+        "primary": ["ad4838d7d35c4d6ea796ee12ae5aedf8"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -281,13 +264,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Bathroom",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "home",
-        "away"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -301,12 +278,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "e2f4322d57924fa090fbbc48b3a140dc"
-        ],
-        "secondary": [
-          "1772a4ea304041adb83f357b751341ff"
-        ]
+        "primary": ["e2f4322d57924fa090fbbc48b3a140dc"],
+        "secondary": ["1772a4ea304041adb83f357b751341ff"]
       },
       "vendor": "Plugwise"
     }
diff --git a/fixtures/adam_zone_per_device/all_data.json b/fixtures/adam_zone_per_device/all_data.json
index 634428a3d..a8d028c19 100644
--- a/fixtures/adam_zone_per_device/all_data.json
+++ b/fixtures/adam_zone_per_device/all_data.json
@@ -36,13 +36,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Badkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "Badkamer Schema",
       "sensors": {
         "temperature": 18.8
@@ -54,12 +48,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "f1fee6043d3642a9b0a65297455f008e"
-        ],
-        "secondary": [
-          "680423ff840043738f42cc7f1ff97a36"
-        ]
+        "primary": ["f1fee6043d3642a9b0a65297455f008e"],
+        "secondary": ["680423ff840043738f42cc7f1ff97a36"]
       },
       "vendor": "Plugwise"
     },
@@ -78,13 +68,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Bios",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -98,12 +82,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "df4a4a8169904cdb9c03d61a21f42140"
-        ],
-        "secondary": [
-          "a2c3583e0a6349358998b760cea82d2a"
-        ]
+        "primary": ["df4a4a8169904cdb9c03d61a21f42140"],
+        "secondary": ["a2c3583e0a6349358998b760cea82d2a"]
       },
       "vendor": "Plugwise"
     },
@@ -143,13 +123,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Garage",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "off",
       "sensors": {
         "temperature": 15.6
@@ -161,9 +135,7 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "e7693eb9582644e5b865dba8d4447cf1"
-        ],
+        "primary": ["e7693eb9582644e5b865dba8d4447cf1"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -299,13 +271,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Jessie",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "CV Jessie",
       "sensors": {
         "temperature": 17.1
@@ -317,12 +283,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "6a3bf693d05e48e0b460c815a4fdd09d"
-        ],
-        "secondary": [
-          "d3da73bde12a47d5a6b8f9dad971f2ec"
-        ]
+        "primary": ["6a3bf693d05e48e0b460c815a4fdd09d"],
+        "secondary": ["d3da73bde12a47d5a6b8f9dad971f2ec"]
       },
       "vendor": "Plugwise"
     },
@@ -454,13 +416,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Woonkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "GF7  Woonkamer",
       "sensors": {
         "electricity_consumed": 35.8,
@@ -474,12 +430,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "b59bcebaf94b499ea7d46e4a66fb62d8"
-        ],
-        "secondary": [
-          "b310b72a0e354bfab43089919b9a88bf"
-        ]
+        "primary": ["b59bcebaf94b499ea7d46e4a66fb62d8"],
+        "secondary": ["b310b72a0e354bfab43089919b9a88bf"]
       },
       "vendor": "Plugwise"
     },
diff --git a/fixtures/anna_elga_2/all_data.json b/fixtures/anna_elga_2/all_data.json
index 4b8c73c7a..3bfa31125 100644
--- a/fixtures/anna_elga_2/all_data.json
+++ b/fixtures/anna_elga_2/all_data.json
@@ -37,10 +37,7 @@
     },
     "ebd90df1ab334565b5895f37590ccff4": {
       "active_preset": "home",
-      "available_schedules": [
-        "Thermostat schedule",
-        "off"
-      ],
+      "available_schedules": ["Thermostat schedule", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -48,13 +45,7 @@
       "location": "d3ce834534114348be628b61b26d9220",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "away",
-        "no_frost",
-        "vacation",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["away", "no_frost", "vacation", "home", "asleep"],
       "select_schedule": "Thermostat schedule",
       "sensors": {
         "cooling_activation_outdoor_temperature": 26.0,
diff --git a/fixtures/anna_elga_2_cooling/all_data.json b/fixtures/anna_elga_2_cooling/all_data.json
index 2bad3f05d..01e63dd5e 100644
--- a/fixtures/anna_elga_2_cooling/all_data.json
+++ b/fixtures/anna_elga_2_cooling/all_data.json
@@ -37,10 +37,7 @@
     },
     "ebd90df1ab334565b5895f37590ccff4": {
       "active_preset": "home",
-      "available_schedules": [
-        "Thermostat schedule",
-        "off"
-      ],
+      "available_schedules": ["Thermostat schedule", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -48,13 +45,7 @@
       "location": "d3ce834534114348be628b61b26d9220",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "away",
-        "no_frost",
-        "vacation",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["away", "no_frost", "vacation", "home", "asleep"],
       "select_schedule": "Thermostat schedule",
       "sensors": {
         "cooling_activation_outdoor_temperature": 26.0,
diff --git a/fixtures/anna_elga_2_schedule_off/all_data.json b/fixtures/anna_elga_2_schedule_off/all_data.json
index 3ea0ab5b5..debd15362 100644
--- a/fixtures/anna_elga_2_schedule_off/all_data.json
+++ b/fixtures/anna_elga_2_schedule_off/all_data.json
@@ -37,10 +37,7 @@
     },
     "ebd90df1ab334565b5895f37590ccff4": {
       "active_preset": "home",
-      "available_schedules": [
-        "Thermostat schedule",
-        "off"
-      ],
+      "available_schedules": ["Thermostat schedule", "off"],
       "climate_mode": "heat_cool",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -48,13 +45,7 @@
       "location": "d3ce834534114348be628b61b26d9220",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "away",
-        "no_frost",
-        "vacation",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["away", "no_frost", "vacation", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "cooling_activation_outdoor_temperature": 26.0,
diff --git a/fixtures/anna_elga_no_cooling/all_data.json b/fixtures/anna_elga_no_cooling/all_data.json
index ee3a73ab7..8336b5594 100644
--- a/fixtures/anna_elga_no_cooling/all_data.json
+++ b/fixtures/anna_elga_no_cooling/all_data.json
@@ -58,10 +58,7 @@
     },
     "3cb70739631c4d17a86b8b12e8a5161b": {
       "active_preset": "home",
-      "available_schedules": [
-        "standaard",
-        "off"
-      ],
+      "available_schedules": ["standaard", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -69,13 +66,7 @@
       "location": "c784ee9fdab44e1395b8dee7d7a497d5",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "home",
-        "away",
-        "asleep",
-        "vacation"
-      ],
+      "preset_modes": ["no_frost", "home", "away", "asleep", "vacation"],
       "select_schedule": "standaard",
       "sensors": {
         "cooling_activation_outdoor_temperature": 21.0,
diff --git a/fixtures/anna_heatpump_cooling/all_data.json b/fixtures/anna_heatpump_cooling/all_data.json
index 5e7096d2e..f9d108522 100644
--- a/fixtures/anna_heatpump_cooling/all_data.json
+++ b/fixtures/anna_heatpump_cooling/all_data.json
@@ -55,10 +55,7 @@
     },
     "3cb70739631c4d17a86b8b12e8a5161b": {
       "active_preset": "home",
-      "available_schedules": [
-        "standaard",
-        "off"
-      ],
+      "available_schedules": ["standaard", "off"],
       "climate_mode": "heat_cool",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -66,13 +63,7 @@
       "location": "c784ee9fdab44e1395b8dee7d7a497d5",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "home",
-        "away",
-        "asleep",
-        "vacation"
-      ],
+      "preset_modes": ["no_frost", "home", "away", "asleep", "vacation"],
       "select_schedule": "off",
       "sensors": {
         "cooling_activation_outdoor_temperature": 21.0,
diff --git a/fixtures/anna_heatpump_cooling_fake_firmware/all_data.json b/fixtures/anna_heatpump_cooling_fake_firmware/all_data.json
index 5749bea7e..b6c19f8ab 100644
--- a/fixtures/anna_heatpump_cooling_fake_firmware/all_data.json
+++ b/fixtures/anna_heatpump_cooling_fake_firmware/all_data.json
@@ -55,10 +55,7 @@
     },
     "3cb70739631c4d17a86b8b12e8a5161b": {
       "active_preset": "home",
-      "available_schedules": [
-        "standaard",
-        "off"
-      ],
+      "available_schedules": ["standaard", "off"],
       "climate_mode": "heat_cool",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -66,13 +63,7 @@
       "location": "c784ee9fdab44e1395b8dee7d7a497d5",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "home",
-        "away",
-        "asleep",
-        "vacation"
-      ],
+      "preset_modes": ["no_frost", "home", "away", "asleep", "vacation"],
       "select_schedule": "off",
       "sensors": {
         "cooling_activation_outdoor_temperature": 21.0,
diff --git a/fixtures/anna_heatpump_heating/all_data.json b/fixtures/anna_heatpump_heating/all_data.json
index 66b02931f..5fc2a114b 100644
--- a/fixtures/anna_heatpump_heating/all_data.json
+++ b/fixtures/anna_heatpump_heating/all_data.json
@@ -60,10 +60,7 @@
     },
     "3cb70739631c4d17a86b8b12e8a5161b": {
       "active_preset": "home",
-      "available_schedules": [
-        "standaard",
-        "off"
-      ],
+      "available_schedules": ["standaard", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -71,13 +68,7 @@
       "location": "c784ee9fdab44e1395b8dee7d7a497d5",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "home",
-        "away",
-        "asleep",
-        "vacation"
-      ],
+      "preset_modes": ["no_frost", "home", "away", "asleep", "vacation"],
       "select_schedule": "standaard",
       "sensors": {
         "cooling_activation_outdoor_temperature": 21.0,
diff --git a/fixtures/anna_loria_cooling_active/all_data.json b/fixtures/anna_loria_cooling_active/all_data.json
index c4cd3cebc..421dc3e34 100644
--- a/fixtures/anna_loria_cooling_active/all_data.json
+++ b/fixtures/anna_loria_cooling_active/all_data.json
@@ -2,11 +2,7 @@
   "devices": {
     "582dfbdace4d4aeb832923ce7d1ddda0": {
       "active_preset": "home",
-      "available_schedules": [
-        "Winter",
-        "Test ",
-        "off"
-      ],
+      "available_schedules": ["Winter", "Test ", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -14,13 +10,7 @@
       "location": "15da035090b847e7a21f93e08c015ebc",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "away",
-        "vacation",
-        "no_frost",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["away", "vacation", "no_frost", "home", "asleep"],
       "select_schedule": "Winter",
       "sensors": {
         "illuminance": 45.0,
@@ -70,13 +60,7 @@
         "heating_state": false
       },
       "dev_class": "heater_central",
-      "dhw_modes": [
-        "off",
-        "auto",
-        "boost",
-        "eco",
-        "comfort"
-      ],
+      "dhw_modes": ["off", "auto", "boost", "eco", "comfort"],
       "location": "674b657c138a41a291d315d7471deb06",
       "max_dhw_temperature": {
         "lower_bound": 35.0,
diff --git a/fixtures/anna_loria_driessens/all_data.json b/fixtures/anna_loria_driessens/all_data.json
index d6225e4a5..3c6579cc2 100644
--- a/fixtures/anna_loria_driessens/all_data.json
+++ b/fixtures/anna_loria_driessens/all_data.json
@@ -33,13 +33,7 @@
       "location": "fa70e08550c94de3a34feb27ecf31421",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "away",
-        "home"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "away", "home"],
       "select_schedule": "Verwarmen@9-23u",
       "sensors": {
         "illuminance": 5.5,
@@ -72,13 +66,7 @@
         "heating_state": false
       },
       "dev_class": "heater_central",
-      "dhw_modes": [
-        "comfort",
-        "eco",
-        "off",
-        "boost",
-        "auto"
-      ],
+      "dhw_modes": ["comfort", "eco", "off", "boost", "auto"],
       "location": "82c15f65c9bf44c592d69e16139355e3",
       "max_dhw_temperature": {
         "lower_bound": 35.0,
diff --git a/fixtures/anna_loria_heating_idle/all_data.json b/fixtures/anna_loria_heating_idle/all_data.json
index 1006547da..6cb54daf2 100644
--- a/fixtures/anna_loria_heating_idle/all_data.json
+++ b/fixtures/anna_loria_heating_idle/all_data.json
@@ -2,11 +2,7 @@
   "devices": {
     "582dfbdace4d4aeb832923ce7d1ddda0": {
       "active_preset": "home",
-      "available_schedules": [
-        "Winter",
-        "Test ",
-        "off"
-      ],
+      "available_schedules": ["Winter", "Test ", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -14,13 +10,7 @@
       "location": "15da035090b847e7a21f93e08c015ebc",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "away",
-        "vacation",
-        "no_frost",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["away", "vacation", "no_frost", "home", "asleep"],
       "select_schedule": "Winter",
       "sensors": {
         "illuminance": 45.0,
@@ -70,13 +60,7 @@
         "heating_state": false
       },
       "dev_class": "heater_central",
-      "dhw_modes": [
-        "off",
-        "auto",
-        "boost",
-        "eco",
-        "comfort"
-      ],
+      "dhw_modes": ["off", "auto", "boost", "eco", "comfort"],
       "location": "674b657c138a41a291d315d7471deb06",
       "max_dhw_temperature": {
         "lower_bound": 35.0,
diff --git a/fixtures/anna_v4/all_data.json b/fixtures/anna_v4/all_data.json
index a9c312534..45a97130a 100644
--- a/fixtures/anna_v4/all_data.json
+++ b/fixtures/anna_v4/all_data.json
@@ -2,11 +2,7 @@
   "devices": {
     "01b85360fdd243d0aaad4d6ac2a5ba7e": {
       "active_preset": "home",
-      "available_schedules": [
-        "Standaard",
-        "Thuiswerken",
-        "off"
-      ],
+      "available_schedules": ["Standaard", "Thuiswerken", "off"],
       "climate_mode": "heat",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -14,13 +10,7 @@
       "location": "eb5309212bf5407bb143e5bfa3b18aee",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "vacation",
-        "no_frost",
-        "away",
-        "asleep",
-        "home"
-      ],
+      "preset_modes": ["vacation", "no_frost", "away", "asleep", "home"],
       "select_schedule": "off",
       "sensors": {
         "illuminance": 60.0,
diff --git a/fixtures/anna_v4_dhw/all_data.json b/fixtures/anna_v4_dhw/all_data.json
index d50a8144b..2e925fa9c 100644
--- a/fixtures/anna_v4_dhw/all_data.json
+++ b/fixtures/anna_v4_dhw/all_data.json
@@ -2,11 +2,7 @@
   "devices": {
     "01b85360fdd243d0aaad4d6ac2a5ba7e": {
       "active_preset": "home",
-      "available_schedules": [
-        "Standaard",
-        "Thuiswerken",
-        "off"
-      ],
+      "available_schedules": ["Standaard", "Thuiswerken", "off"],
       "climate_mode": "heat",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -14,13 +10,7 @@
       "location": "eb5309212bf5407bb143e5bfa3b18aee",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "vacation",
-        "no_frost",
-        "away",
-        "asleep",
-        "home"
-      ],
+      "preset_modes": ["vacation", "no_frost", "away", "asleep", "home"],
       "select_schedule": "off",
       "sensors": {
         "illuminance": 60.0,
diff --git a/fixtures/anna_v4_no_tag/all_data.json b/fixtures/anna_v4_no_tag/all_data.json
index 602e59ea4..7b3dccda4 100644
--- a/fixtures/anna_v4_no_tag/all_data.json
+++ b/fixtures/anna_v4_no_tag/all_data.json
@@ -2,11 +2,7 @@
   "devices": {
     "01b85360fdd243d0aaad4d6ac2a5ba7e": {
       "active_preset": "home",
-      "available_schedules": [
-        "Standaard",
-        "Thuiswerken",
-        "off"
-      ],
+      "available_schedules": ["Standaard", "Thuiswerken", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -14,13 +10,7 @@
       "location": "eb5309212bf5407bb143e5bfa3b18aee",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "vacation",
-        "no_frost",
-        "away",
-        "asleep",
-        "home"
-      ],
+      "preset_modes": ["vacation", "no_frost", "away", "asleep", "home"],
       "select_schedule": "Thuiswerken",
       "sensors": {
         "illuminance": 60.0,
diff --git a/fixtures/anna_without_boiler_fw441/all_data.json b/fixtures/anna_without_boiler_fw441/all_data.json
index 12b5b0336..ff70e3088 100644
--- a/fixtures/anna_without_boiler_fw441/all_data.json
+++ b/fixtures/anna_without_boiler_fw441/all_data.json
@@ -2,11 +2,7 @@
   "devices": {
     "7ffbb3ab4b6c4ab2915d7510f7bf8fe9": {
       "active_preset": "home",
-      "available_schedules": [
-        "Test",
-        "Normaal",
-        "off"
-      ],
+      "available_schedules": ["Test", "Normaal", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -14,13 +10,7 @@
       "location": "c34c6864216446528e95d88985e714cc",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "away",
-        "vacation",
-        "home"
-      ],
+      "preset_modes": ["no_frost", "asleep", "away", "vacation", "home"],
       "select_schedule": "Normaal",
       "sensors": {
         "illuminance": 0.25,
diff --git a/fixtures/legacy_anna/all_data.json b/fixtures/legacy_anna/all_data.json
index 2b0a27182..2cb439950 100644
--- a/fixtures/legacy_anna/all_data.json
+++ b/fixtures/legacy_anna/all_data.json
@@ -43,13 +43,7 @@
       "location": "0000aaaa0000aaaa0000aaaa0000aa00",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "away",
-        "vacation",
-        "asleep",
-        "home",
-        "no_frost"
-      ],
+      "preset_modes": ["away", "vacation", "asleep", "home", "no_frost"],
       "sensors": {
         "illuminance": 150.8,
         "setpoint": 20.5,
diff --git a/fixtures/legacy_anna_2/all_data.json b/fixtures/legacy_anna_2/all_data.json
index 537a12b86..735913ce0 100644
--- a/fixtures/legacy_anna_2/all_data.json
+++ b/fixtures/legacy_anna_2/all_data.json
@@ -2,10 +2,7 @@
   "devices": {
     "9e7377867dc24e51b8098a5ba02bd89d": {
       "active_preset": null,
-      "available_schedules": [
-        "Thermostat schedule",
-        "off"
-      ],
+      "available_schedules": ["Thermostat schedule", "off"],
       "climate_mode": "heat",
       "dev_class": "thermostat",
       "firmware": "2017-03-13T11:54:58+01:00",
@@ -13,13 +10,7 @@
       "location": "be81e3f8275b4129852c4d8d550ae2eb",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "vacation",
-        "away",
-        "no_frost",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["vacation", "away", "no_frost", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "illuminance": 19.5,
diff --git a/fixtures/m_adam_cooling/all_data.json b/fixtures/m_adam_cooling/all_data.json
index f594f07bb..9c40e5027 100644
--- a/fixtures/m_adam_cooling/all_data.json
+++ b/fixtures/m_adam_cooling/all_data.json
@@ -73,11 +73,7 @@
       },
       "dev_class": "gateway",
       "firmware": "3.7.8",
-      "gateway_modes": [
-        "away",
-        "full",
-        "vacation"
-      ],
+      "gateway_modes": ["away", "full", "vacation"],
       "hardware": "AME Smile 2.0 board",
       "location": "bc93488efab249e5bc54fd7e175a6f91",
       "mac_address": "012345679891",
@@ -152,13 +148,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Living room",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "home",
-        "away"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 149.9,
@@ -172,9 +162,7 @@
         "upper_bound": 35.0
       },
       "thermostats": {
-        "primary": [
-          "ad4838d7d35c4d6ea796ee12ae5aedf8"
-        ],
+        "primary": ["ad4838d7d35c4d6ea796ee12ae5aedf8"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -193,13 +181,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Bathroom",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "home",
-        "away"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
       "select_schedule": "Badkamer",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -213,12 +195,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "e2f4322d57924fa090fbbc48b3a140dc"
-        ],
-        "secondary": [
-          "1772a4ea304041adb83f357b751341ff"
-        ]
+        "primary": ["e2f4322d57924fa090fbbc48b3a140dc"],
+        "secondary": ["1772a4ea304041adb83f357b751341ff"]
       },
       "vendor": "Plugwise"
     }
diff --git a/fixtures/m_adam_heating/all_data.json b/fixtures/m_adam_heating/all_data.json
index b1d3f9aa8..bb24faeeb 100644
--- a/fixtures/m_adam_heating/all_data.json
+++ b/fixtures/m_adam_heating/all_data.json
@@ -78,23 +78,14 @@
       },
       "dev_class": "gateway",
       "firmware": "3.7.8",
-      "gateway_modes": [
-        "away",
-        "full",
-        "vacation"
-      ],
+      "gateway_modes": ["away", "full", "vacation"],
       "hardware": "AME Smile 2.0 board",
       "location": "bc93488efab249e5bc54fd7e175a6f91",
       "mac_address": "012345679891",
       "model": "Gateway",
       "model_id": "smile_open_therm",
       "name": "Adam",
-      "regulation_modes": [
-        "bleeding_hot",
-        "bleeding_cold",
-        "off",
-        "heating"
-      ],
+      "regulation_modes": ["bleeding_hot", "bleeding_cold", "off", "heating"],
       "select_gateway_mode": "full",
       "select_regulation_mode": "heating",
       "sensors": {
@@ -156,13 +147,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Living room",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "home",
-        "away"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 149.9,
@@ -176,9 +161,7 @@
         "upper_bound": 35.0
       },
       "thermostats": {
-        "primary": [
-          "ad4838d7d35c4d6ea796ee12ae5aedf8"
-        ],
+        "primary": ["ad4838d7d35c4d6ea796ee12ae5aedf8"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -197,13 +180,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Bathroom",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "home",
-        "away"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
       "select_schedule": "Badkamer",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -217,12 +194,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "e2f4322d57924fa090fbbc48b3a140dc"
-        ],
-        "secondary": [
-          "1772a4ea304041adb83f357b751341ff"
-        ]
+        "primary": ["e2f4322d57924fa090fbbc48b3a140dc"],
+        "secondary": ["1772a4ea304041adb83f357b751341ff"]
       },
       "vendor": "Plugwise"
     }
diff --git a/fixtures/m_adam_jip/all_data.json b/fixtures/m_adam_jip/all_data.json
index c3a4c5092..1ca9e7701 100644
--- a/fixtures/m_adam_jip/all_data.json
+++ b/fixtures/m_adam_jip/all_data.json
@@ -7,13 +7,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Slaapkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "sensors": {
         "temperature": 24.2
       },
@@ -24,12 +18,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "1346fbd8498d4dbcab7e18d51b771f3d"
-        ],
-        "secondary": [
-          "356b65335e274d769c338223e7af9c33"
-        ]
+        "primary": ["1346fbd8498d4dbcab7e18d51b771f3d"],
+        "secondary": ["356b65335e274d769c338223e7af9c33"]
       },
       "vendor": "Plugwise"
     },
@@ -40,13 +30,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Woonkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "sensors": {
         "temperature": 27.4
       },
@@ -57,12 +41,8 @@
         "upper_bound": 30.0
       },
       "thermostats": {
-        "primary": [
-          "f61f1a2535f54f52ad006a3d18e459ca"
-        ],
-        "secondary": [
-          "833de10f269c4deab58fb9df69901b4e"
-        ]
+        "primary": ["f61f1a2535f54f52ad006a3d18e459ca"],
+        "secondary": ["833de10f269c4deab58fb9df69901b4e"]
       },
       "vendor": "Plugwise"
     },
@@ -239,23 +219,14 @@
       },
       "dev_class": "gateway",
       "firmware": "3.2.8",
-      "gateway_modes": [
-        "away",
-        "full",
-        "vacation"
-      ],
+      "gateway_modes": ["away", "full", "vacation"],
       "hardware": "AME Smile 2.0 board",
       "location": "9e4433a9d69f40b3aefd15e74395eaec",
       "mac_address": "012345670001",
       "model": "Gateway",
       "model_id": "smile_open_therm",
       "name": "Adam",
-      "regulation_modes": [
-        "heating",
-        "off",
-        "bleeding_cold",
-        "bleeding_hot"
-      ],
+      "regulation_modes": ["heating", "off", "bleeding_cold", "bleeding_hot"],
       "select_gateway_mode": "full",
       "select_regulation_mode": "heating",
       "sensors": {
@@ -271,13 +242,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Kinderkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "sensors": {
         "temperature": 30.0
       },
@@ -288,12 +253,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "6f3e9d7084214c21b9dfa46f6eeb8700"
-        ],
-        "secondary": [
-          "d4496250d0e942cfa7aea3476e9070d5"
-        ]
+        "primary": ["6f3e9d7084214c21b9dfa46f6eeb8700"],
+        "secondary": ["d4496250d0e942cfa7aea3476e9070d5"]
       },
       "vendor": "Plugwise"
     },
@@ -328,13 +289,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Logeerkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "sensors": {
         "temperature": 30.0
       },
@@ -345,12 +300,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "a6abc6a129ee499c88a4d420cc413b47"
-        ],
-        "secondary": [
-          "1da4d325838e4ad8aac12177214505c9"
-        ]
+        "primary": ["a6abc6a129ee499c88a4d420cc413b47"],
+        "secondary": ["1da4d325838e4ad8aac12177214505c9"]
       },
       "vendor": "Plugwise"
     },
diff --git a/fixtures/m_adam_multiple_devices_per_zone/all_data.json b/fixtures/m_adam_multiple_devices_per_zone/all_data.json
index 416a2ac8e..8da184a7a 100644
--- a/fixtures/m_adam_multiple_devices_per_zone/all_data.json
+++ b/fixtures/m_adam_multiple_devices_per_zone/all_data.json
@@ -36,13 +36,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Badkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "Badkamer Schema",
       "sensors": {
         "temperature": 18.9
@@ -77,13 +71,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Bios",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -97,12 +85,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "df4a4a8169904cdb9c03d61a21f42140"
-        ],
-        "secondary": [
-          "a2c3583e0a6349358998b760cea82d2a"
-        ]
+        "primary": ["df4a4a8169904cdb9c03d61a21f42140"],
+        "secondary": ["a2c3583e0a6349358998b760cea82d2a"]
       },
       "vendor": "Plugwise"
     },
@@ -134,13 +118,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Garage",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "sensors": {
         "temperature": 15.6
       },
@@ -151,9 +129,7 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "e7693eb9582644e5b865dba8d4447cf1"
-        ],
+        "primary": ["e7693eb9582644e5b865dba8d4447cf1"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -289,13 +265,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Jessie",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "CV Jessie",
       "sensors": {
         "temperature": 17.2
@@ -307,12 +277,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "6a3bf693d05e48e0b460c815a4fdd09d"
-        ],
-        "secondary": [
-          "d3da73bde12a47d5a6b8f9dad971f2ec"
-        ]
+        "primary": ["6a3bf693d05e48e0b460c815a4fdd09d"],
+        "secondary": ["d3da73bde12a47d5a6b8f9dad971f2ec"]
       },
       "vendor": "Plugwise"
     },
@@ -444,13 +410,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Woonkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "GF7  Woonkamer",
       "sensors": {
         "electricity_consumed": 35.6,
@@ -464,12 +424,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "b59bcebaf94b499ea7d46e4a66fb62d8"
-        ],
-        "secondary": [
-          "b310b72a0e354bfab43089919b9a88bf"
-        ]
+        "primary": ["b59bcebaf94b499ea7d46e4a66fb62d8"],
+        "secondary": ["b310b72a0e354bfab43089919b9a88bf"]
       },
       "vendor": "Plugwise"
     },
diff --git a/fixtures/m_anna_heatpump_cooling/all_data.json b/fixtures/m_anna_heatpump_cooling/all_data.json
index 044de1244..74f20379d 100644
--- a/fixtures/m_anna_heatpump_cooling/all_data.json
+++ b/fixtures/m_anna_heatpump_cooling/all_data.json
@@ -60,10 +60,7 @@
     },
     "3cb70739631c4d17a86b8b12e8a5161b": {
       "active_preset": "home",
-      "available_schedules": [
-        "standaard",
-        "off"
-      ],
+      "available_schedules": ["standaard", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -71,13 +68,7 @@
       "location": "c784ee9fdab44e1395b8dee7d7a497d5",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "home",
-        "away",
-        "asleep",
-        "vacation"
-      ],
+      "preset_modes": ["no_frost", "home", "away", "asleep", "vacation"],
       "select_schedule": "standaard",
       "sensors": {
         "cooling_activation_outdoor_temperature": 21.0,
diff --git a/fixtures/m_anna_heatpump_idle/all_data.json b/fixtures/m_anna_heatpump_idle/all_data.json
index bc33ac339..3b1e9bf8c 100644
--- a/fixtures/m_anna_heatpump_idle/all_data.json
+++ b/fixtures/m_anna_heatpump_idle/all_data.json
@@ -60,10 +60,7 @@
     },
     "3cb70739631c4d17a86b8b12e8a5161b": {
       "active_preset": "home",
-      "available_schedules": [
-        "standaard",
-        "off"
-      ],
+      "available_schedules": ["standaard", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -71,13 +68,7 @@
       "location": "c784ee9fdab44e1395b8dee7d7a497d5",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "home",
-        "away",
-        "asleep",
-        "vacation"
-      ],
+      "preset_modes": ["no_frost", "home", "away", "asleep", "vacation"],
       "select_schedule": "standaard",
       "sensors": {
         "cooling_activation_outdoor_temperature": 25.0,
diff --git a/fixtures/p1v4/all_data.json b/fixtures/p1v4/all_data.json
deleted file mode 100644
index daba3ddbf..000000000
--- a/fixtures/p1v4/all_data.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
-  "devices": {
-    "a455b61e52394b2db5081ce025a430f3": {
-      "binary_sensors": {
-        "plugwise_notification": true
-      },
-      "dev_class": "gateway",
-      "firmware": "4.1.1",
-      "hardware": "AME Smile 2.0 board",
-      "location": "a455b61e52394b2db5081ce025a430f3",
-      "mac_address": "012345670001",
-      "model": "Gateway",
-      "model_id": "smile",
-      "name": "Smile P1",
-      "vendor": "Plugwise"
-    },
-    "ba4de7613517478da82dd9b6abea36af": {
-      "available": false,
-      "dev_class": "smartmeter",
-      "location": "a455b61e52394b2db5081ce025a430f3",
-      "model": "KFM5KAIFA-METER",
-      "name": "P1",
-      "sensors": {
-        "electricity_consumed_off_peak_cumulative": 11915.899,
-        "electricity_consumed_off_peak_interval": 0,
-        "electricity_consumed_off_peak_point": 0,
-        "electricity_consumed_peak_cumulative": 9067.554,
-        "electricity_consumed_peak_interval": 335,
-        "electricity_consumed_peak_point": 571,
-        "electricity_produced_off_peak_cumulative": 0.0,
-        "electricity_produced_off_peak_interval": 0,
-        "electricity_produced_off_peak_point": 0,
-        "electricity_produced_peak_cumulative": 0.0,
-        "electricity_produced_peak_interval": 0,
-        "electricity_produced_peak_point": 0,
-        "net_electricity_cumulative": 20983.453,
-        "net_electricity_point": 571
-      },
-      "vendor": "SHENZHEN KAIFA TECHNOLOGY CHENGDU CO."
-    }
-  },
-  "gateway": {
-    "gateway_id": "a455b61e52394b2db5081ce025a430f3",
-    "item_count": 30,
-    "notifications": {
-      "97a04c0c263049b29350a660b4cdd01e": {
-        "warning": "The Smile P1 does not seem to be connected to a smart meter."
-      }
-    },
-    "reboot": true,
-    "smile_name": "Smile P1"
-  }
-}
diff --git a/fixtures/stretch_v23/all_data.json b/fixtures/stretch_v23/all_data.json
index 77bc12c40..e4c0326ea 100644
--- a/fixtures/stretch_v23/all_data.json
+++ b/fixtures/stretch_v23/all_data.json
@@ -305,9 +305,7 @@
     },
     "f7b145c8492f4dd7a4de760456fdef3e": {
       "dev_class": "switching",
-      "members": [
-        "407aa1c1099d463c9137a3a9eda787fd"
-      ],
+      "members": ["407aa1c1099d463c9137a3a9eda787fd"],
       "model": "Switchgroup",
       "name": "Test",
       "switches": {
diff --git a/plugwise/__init__.py b/plugwise/__init__.py
index 562ad7938..0139bba0d 100644
--- a/plugwise/__init__.py
+++ b/plugwise/__init__.py
@@ -2,6 +2,7 @@
 
 Plugwise backend module for Home Assistant Core.
 """
+
 from __future__ import annotations
 
 from plugwise.constants import (
@@ -63,7 +64,7 @@ def __init__(
             self._timeout,
             self._username,
             self._websession,
-         )
+        )
 
         self._cooling_present = False
         self._elga = False
@@ -125,52 +126,56 @@ async def connect(self) -> Version | None:
         # Determine smile specifics
         await self._smile_detect(result, dsmrmain)
 
-        self._smile_api = SmileAPI(
-            self._host,
-            self._password,
-            self._request,
-            self._websession,
-            self._cooling_present,
-            self._elga,
-            self._is_thermostat,
-            self._last_active,
-            self._loc_data,
-            self._on_off_device,
-            self._opentherm_device,
-            self._schedule_old_states,
-            self.gateway_id,
-            self.smile_fw_version,
-            self.smile_hostname,
-            self.smile_hw_version,
-            self.smile_mac_address,
-            self.smile_model,
-            self.smile_model_id,
-            self.smile_name,
-            self.smile_type,
-            self.smile_version,
-            self._port,
-            self._username,
-         ) if not self.smile_legacy else SmileLegacyAPI(
-            self._host,
-            self._password,
-            self._request,
-            self._websession,
-            self._is_thermostat,
-            self._loc_data,
-            self._on_off_device,
-            self._opentherm_device,
-            self._stretch_v2,
-            self._target_smile,
-            self.smile_fw_version,
-            self.smile_hostname,
-            self.smile_hw_version,
-            self.smile_mac_address,
-            self.smile_model,
-            self.smile_name,
-            self.smile_type,
-            self.smile_zigbee_mac_address,
-            self._port,
-            self._username,
+        self._smile_api = (
+            SmileAPI(
+                self._host,
+                self._password,
+                self._request,
+                self._websession,
+                self._cooling_present,
+                self._elga,
+                self._is_thermostat,
+                self._last_active,
+                self._loc_data,
+                self._on_off_device,
+                self._opentherm_device,
+                self._schedule_old_states,
+                self.gateway_id,
+                self.smile_fw_version,
+                self.smile_hostname,
+                self.smile_hw_version,
+                self.smile_mac_address,
+                self.smile_model,
+                self.smile_model_id,
+                self.smile_name,
+                self.smile_type,
+                self.smile_version,
+                self._port,
+                self._username,
+            )
+            if not self.smile_legacy
+            else SmileLegacyAPI(
+                self._host,
+                self._password,
+                self._request,
+                self._websession,
+                self._is_thermostat,
+                self._loc_data,
+                self._on_off_device,
+                self._opentherm_device,
+                self._stretch_v2,
+                self._target_smile,
+                self.smile_fw_version,
+                self.smile_hostname,
+                self.smile_hw_version,
+                self.smile_mac_address,
+                self.smile_model,
+                self.smile_name,
+                self.smile_type,
+                self.smile_zigbee_mac_address,
+                self._port,
+                self._username,
+            )
         )
 
         # Update all endpoints on first connect
@@ -203,7 +208,7 @@ async def _smile_detect(self, result: etree, dsmrmain: etree) -> None:
             )
             raise UnsupportedDeviceError
 
-        version_major= str(self.smile_fw_version.major)
+        version_major = str(self.smile_fw_version.major)
         self._target_smile = f"{model}_v{version_major}"
         LOGGER.debug("Plugwise identified as %s", self._target_smile)
         if self._target_smile not in SMILES:
@@ -318,9 +323,9 @@ async def async_update(self) -> PlugwiseData:
 
         return data
 
-########################################################################################################
-###  API Set and HA Service-related Functions                                                        ###
-########################################################################################################
+    ########################################################################################################
+    ###  API Set and HA Service-related Functions                                                        ###
+    ########################################################################################################
 
     async def set_select(
         self,
@@ -333,7 +338,9 @@ async def set_select(
         try:
             await self._smile_api.set_select(key, loc_id, option, state)
         except ConnectionFailedError as exc:
-            raise ConnectionFailedError(f"Failed to set select option '{option}': {str(exc)}") from exc
+            raise ConnectionFailedError(
+                f"Failed to set select option '{option}': {str(exc)}"
+            ) from exc
 
     async def set_schedule_state(
         self,
@@ -345,8 +352,9 @@ async def set_schedule_state(
         try:
             await self._smile_api.set_schedule_state(loc_id, state, name)
         except ConnectionFailedError as exc:  # pragma no cover
-            raise ConnectionFailedError(f"Failed to set schedule state: {str(exc)}") from exc  # pragma no cover
-
+            raise ConnectionFailedError(
+                f"Failed to set schedule state: {str(exc)}"
+            ) from exc  # pragma no cover
 
     async def set_preset(self, loc_id: str, preset: str) -> None:
         """Set the given Preset on the relevant Thermostat."""
@@ -360,7 +368,9 @@ async def set_temperature(self, loc_id: str, items: dict[str, float]) -> None:
         try:
             await self._smile_api.set_temperature(loc_id, items)
         except ConnectionFailedError as exc:
-            raise ConnectionFailedError(f"Failed to set temperature: {str(exc)}") from exc
+            raise ConnectionFailedError(
+                f"Failed to set temperature: {str(exc)}"
+            ) from exc
 
     async def set_number(
         self,
@@ -372,14 +382,18 @@ async def set_number(
         try:
             await self._smile_api.set_number(dev_id, key, temperature)
         except ConnectionFailedError as exc:
-            raise ConnectionFailedError(f"Failed to set number '{key}': {str(exc)}") from exc
+            raise ConnectionFailedError(
+                f"Failed to set number '{key}': {str(exc)}"
+            ) from exc
 
     async def set_temperature_offset(self, dev_id: str, offset: float) -> None:
         """Set the Temperature offset for thermostats that support this feature."""
         try:  # pragma no cover
             await self._smile_api.set_offset(dev_id, offset)  # pragma: no cover
         except ConnectionFailedError as exc:  # pragma no cover
-            raise ConnectionFailedError(f"Failed to set temperature offset: {str(exc)}") from exc  # pragma no cover
+            raise ConnectionFailedError(
+                f"Failed to set temperature offset: {str(exc)}"
+            ) from exc  # pragma no cover
 
     async def set_switch_state(
         self, appl_id: str, members: list[str] | None, model: str, state: str
@@ -388,39 +402,51 @@ async def set_switch_state(
         try:
             await self._smile_api.set_switch_state(appl_id, members, model, state)
         except ConnectionFailedError as exc:
-            raise ConnectionFailedError(f"Failed to set switch state: {str(exc)}") from exc
+            raise ConnectionFailedError(
+                f"Failed to set switch state: {str(exc)}"
+            ) from exc
 
     async def set_gateway_mode(self, mode: str) -> None:
         """Set the gateway mode."""
         try:  # pragma no cover
             await self._smile_api.set_gateway_mode(mode)  # pragma: no cover
         except ConnectionFailedError as exc:  # pragma no cover
-            raise ConnectionFailedError(f"Failed to set gateway mode: {str(exc)}") from exc  # pragma no cover
+            raise ConnectionFailedError(
+                f"Failed to set gateway mode: {str(exc)}"
+            ) from exc  # pragma no cover
 
     async def set_regulation_mode(self, mode: str) -> None:
         """Set the heating regulation mode."""
         try:  # pragma no cover
             await self._smile_api.set_regulation_mode(mode)  # pragma: no cover
         except ConnectionFailedError as exc:  # pragma no cover
-            raise ConnectionFailedError(f"Failed to set regulation mode: {str(exc)}") from exc  # pragma no cover
+            raise ConnectionFailedError(
+                f"Failed to set regulation mode: {str(exc)}"
+            ) from exc  # pragma no cover
 
     async def set_dhw_mode(self, mode: str) -> None:
         """Set the domestic hot water heating regulation mode."""
         try:  # pragma no cover
             await self._smile_api.set_dhw_mode(mode)  # pragma: no cover
         except ConnectionFailedError as exc:  # pragma no cover
-            raise ConnectionFailedError(f"Failed to set dhw mode: {str(exc)}") from exc  # pragma no cover
+            raise ConnectionFailedError(
+                f"Failed to set dhw mode: {str(exc)}"
+            ) from exc  # pragma no cover
 
     async def delete_notification(self) -> None:
         """Delete the active Plugwise Notification."""
         try:
             await self._smile_api.delete_notification()
         except ConnectionFailedError as exc:
-            raise ConnectionFailedError(f"Failed to delete notification: {str(exc)}") from exc
+            raise ConnectionFailedError(
+                f"Failed to delete notification: {str(exc)}"
+            ) from exc
 
     async def reboot_gateway(self) -> None:
         """Reboot the Plugwise Gateway."""
         try:
             await self._smile_api.reboot_gateway()
         except ConnectionFailedError as exc:
-            raise ConnectionFailedError(f"Failed to reboot gateway: {str(exc)}") from exc
+            raise ConnectionFailedError(
+                f"Failed to reboot gateway: {str(exc)}"
+            ) from exc
diff --git a/plugwise/common.py b/plugwise/common.py
index 8266f9a4a..d1300b592 100644
--- a/plugwise/common.py
+++ b/plugwise/common.py
@@ -2,6 +2,7 @@
 
 Plugwise Smile protocol helpers.
 """
+
 from __future__ import annotations
 
 from typing import cast
@@ -83,21 +84,23 @@ def _appl_heater_central_info(
         appl.hardware = module_data["hardware_version"]
         appl.model_id = module_data["vendor_model"] if not legacy else None
         appl.model = (
-            "Generic heater/cooler"
-            if self._cooling_present
-            else "Generic heater"
+            "Generic heater/cooler" if self._cooling_present else "Generic heater"
         )
 
         return appl
 
-    def _appl_thermostat_info(self, appl: Munch, xml_1: etree, xml_2: etree = None) -> Munch:
+    def _appl_thermostat_info(
+        self, appl: Munch, xml_1: etree, xml_2: etree = None
+    ) -> Munch:
         """Helper-function for _appliance_info_finder()."""
         locator = "./logs/point_log[type='thermostat']/thermostat"
         xml_2 = return_valid(xml_2, self._domain_objects)
         module_data = self._get_module_data(xml_1, locator, xml_2)
         appl.vendor_name = module_data["vendor_name"]
         appl.model = module_data["vendor_model"]
-        if appl.model != "ThermoTouch":  # model_id for Anna not present as stand-alone device
+        if (
+            appl.model != "ThermoTouch"
+        ):  # model_id for Anna not present as stand-alone device
             appl.model_id = appl.model
             appl.model = check_model(appl.model, appl.vendor_name)
 
@@ -108,7 +111,9 @@ def _appl_thermostat_info(self, appl: Munch, xml_1: etree, xml_2: etree = None)
 
         return appl
 
-    def _collect_power_values(self, data: GwEntityData, loc: Munch, tariff: str, legacy: bool = False) -> None:
+    def _collect_power_values(
+        self, data: GwEntityData, loc: Munch, tariff: str, legacy: bool = False
+    ) -> None:
         """Something."""
         for loc.peak_select in ("nl_peak", "nl_offpeak"):
             loc.locator = (
@@ -220,9 +225,7 @@ def _create_gw_entities(self, appl: Munch) -> None:
                 self.gw_entities[appl.entity_id][appl_key] = value
                 self._count += 1
 
-    def _entity_switching_group(
-        self, entity: GwEntityData, data: GwEntityData
-    ) -> None:
+    def _entity_switching_group(self, entity: GwEntityData, data: GwEntityData) -> None:
         """Helper-function for _get_device_zone_data().
 
         Determine switching group device data.
@@ -268,7 +271,9 @@ def _get_group_switches(self) -> dict[str, GwEntityData]:
 
         return switch_groups
 
-    def _get_lock_state(self, xml: etree, data: GwEntityData, stretch_v2: bool = False) -> None:
+    def _get_lock_state(
+        self, xml: etree, data: GwEntityData, stretch_v2: bool = False
+    ) -> None:
         """Helper-function for _get_measurement_data().
 
         Adam & Stretches: obtain the relay-switch lock state.
@@ -323,7 +328,9 @@ def _get_module_data(
 
         return module_data
 
-    def _get_zigbee_data(self, module: etree, module_data: ModuleData, legacy: bool) -> None:
+    def _get_zigbee_data(
+        self, module: etree, module_data: ModuleData, legacy: bool
+    ) -> None:
         """Helper-function for _get_module_data()."""
         if legacy:
             # Stretches
@@ -334,5 +341,5 @@ def _get_zigbee_data(self, module: etree, module_data: ModuleData, legacy: bool)
                 module_data["zigbee_mac_address"] = coord.find("mac_address").text
         # Adam
         elif (zb_node := module.find("./protocols/zig_bee_node")) is not None:
-                module_data["zigbee_mac_address"] = zb_node.find("mac_address").text
-                module_data["reachable"] = zb_node.find("reachable").text == "true"
+            module_data["zigbee_mac_address"] = zb_node.find("mac_address").text
+            module_data["reachable"] = zb_node.find("reachable").text == "true"
diff --git a/plugwise/constants.py b/plugwise/constants.py
index e332f812b..63c6af3e9 100644
--- a/plugwise/constants.py
+++ b/plugwise/constants.py
@@ -1,4 +1,5 @@
 """Plugwise Smile constants."""
+
 from __future__ import annotations
 
 from collections import namedtuple
@@ -167,9 +168,7 @@
     "intended_boiler_state": DATA(
         "heating_state", NONE
     ),  # Legacy Anna: shows when heating is active, we don't show dhw_state, cannot be determined reliably
-    "flame_state": UOM(
-        NONE
-    ),  # Also present when there is a single gas-heater
+    "flame_state": UOM(NONE),  # Also present when there is a single gas-heater
     "intended_boiler_temperature": UOM(
         TEMP_CELSIUS
     ),  # Non-zero when heating, zero when dhw-heating
@@ -585,4 +584,3 @@ class PlugwiseData:
 
     devices: dict[str, GwEntityData]
     gateway: GatewayData
-
diff --git a/plugwise/data.py b/plugwise/data.py
index 2b3740a11..a46404ae7 100644
--- a/plugwise/data.py
+++ b/plugwise/data.py
@@ -2,6 +2,7 @@
 
 Plugwise Smile protocol data-collection helpers.
 """
+
 from __future__ import annotations
 
 import re
@@ -27,7 +28,6 @@ def __init__(self) -> None:
         """Init."""
         SmileHelper.__init__(self)
 
-
     def _all_entity_data(self) -> None:
         """Helper-function for get_all_gateway_entities().
 
@@ -78,7 +78,13 @@ def _update_gw_entities(self) -> None:
                 mac_list
                 and "low_battery" in entity["binary_sensors"]
                 and entity["zigbee_mac_address"] in mac_list
-                and entity["dev_class"] in ("thermo_sensor", "thermostatic_radiator_valve", "zone_thermometer", "zone_thermostat")
+                and entity["dev_class"]
+                in (
+                    "thermo_sensor",
+                    "thermostatic_radiator_valve",
+                    "zone_thermometer",
+                    "zone_thermostat",
+                )
             )
             if is_battery_low:
                 entity["binary_sensors"]["low_battery"] = True
@@ -98,7 +104,11 @@ def _detect_low_batteries(self) -> list[str]:
                 message: str | None = notification.get("message")
                 warning: str | None = notification.get("warning")
                 notify = message or warning
-                if notify is not None and all(x in notify for x in matches) and (mac_addresses := mac_pattern.findall(notify)):
+                if (
+                    notify is not None
+                    and all(x in notify for x in matches)
+                    and (mac_addresses := mac_pattern.findall(notify))
+                ):
                     mac_address = mac_addresses[0]  # re.findall() outputs a list
 
                 if mac_address is not None:
@@ -114,9 +124,7 @@ def _add_or_update_notifications(
         """Helper-function adding or updating the Plugwise notifications."""
         if (
             entity_id == self.gateway_id
-            and (
-                self._is_thermostat or self.smile_type == "power"
-            )
+            and (self._is_thermostat or self.smile_type == "power")
         ) or (
             "binary_sensors" in entity
             and "plugwise_notification" in entity["binary_sensors"]
@@ -152,7 +160,6 @@ def _update_for_cooling(self, entity: GwEntityData) -> None:
             sensors["setpoint_high"] = temp_dict["setpoint_high"]
             self._count += 2  # add 4, remove 2
 
-
     def _get_location_data(self, loc_id: str) -> GwEntityData:
         """Helper-function for _all_entity_data() and async_update().
 
@@ -235,7 +242,10 @@ def _get_adam_data(self, entity: GwEntityData, data: GwEntityData) -> None:
                 data["binary_sensors"]["heating_state"] = self._heating_valves() != 0
             # Add cooling_enabled binary_sensor
             if "binary_sensors" in data:
-                if "cooling_enabled" not in data["binary_sensors"] and self._cooling_present:
+                if (
+                    "cooling_enabled" not in data["binary_sensors"]
+                    and self._cooling_present
+                ):
                     data["binary_sensors"]["cooling_enabled"] = self._cooling_enabled
 
         # Show the allowed regulation_modes and gateway_modes
@@ -248,10 +258,7 @@ def _get_adam_data(self, entity: GwEntityData, data: GwEntityData) -> None:
                 self._count += 1
 
     def _climate_data(
-        self,
-        location_id: str,
-        entity: GwEntityData,
-        data: GwEntityData
+        self, location_id: str, entity: GwEntityData, data: GwEntityData
     ) -> None:
         """Helper-function for _get_entity_data().
 
@@ -282,7 +289,9 @@ def _climate_data(
         if sel_schedule in (NONE, OFF):
             data["climate_mode"] = "heat"
             if self._cooling_present:
-                data["climate_mode"] = "cool" if self.check_reg_mode("cooling") else "heat_cool"
+                data["climate_mode"] = (
+                    "cool" if self.check_reg_mode("cooling") else "heat_cool"
+                )
 
         if self.check_reg_mode("off"):
             data["climate_mode"] = "off"
diff --git a/plugwise/helper.py b/plugwise/helper.py
index 4c39b08ec..20fda20f0 100644
--- a/plugwise/helper.py
+++ b/plugwise/helper.py
@@ -2,6 +2,7 @@
 
 Plugwise Smile protocol helpers.
 """
+
 from __future__ import annotations
 
 import asyncio
@@ -179,7 +180,9 @@ async def _request_validate(self, resp: ClientResponse, method: str) -> etree:
                 # Command accepted gives empty body with status 202
                 return
             case 401:
-                msg = "Invalid Plugwise login, please retry with the correct credentials."
+                msg = (
+                    "Invalid Plugwise login, please retry with the correct credentials."
+                )
                 LOGGER.error("%s", msg)
                 raise InvalidAuthentication
             case 405:
@@ -392,7 +395,9 @@ def _appliance_info_finder(self, appl: Munch, appliance: etree) -> Munch:
                 return self._appl_thermostat_info(appl, appliance)
             case "heater_central":
                 # Collect heater_central device info
-                self._appl_heater_central_info(appl, appliance, False)  # False means non-legacy device
+                self._appl_heater_central_info(
+                    appl, appliance, False
+                )  # False means non-legacy device
                 self._appl_dhw_mode_info(appl, appliance)
                 # Skip orphaned heater_central (Core Issue #104433)
                 if appl.entity_id != self._heater_id:
@@ -430,7 +435,9 @@ def _appl_gateway_info(self, appl: Munch, appliance: etree) -> Munch:
 
         # Adam: collect the ZigBee MAC address of the Smile
         if self.smile(ADAM):
-            if (found := self._domain_objects.find(".//protocols/zig_bee_coordinator")) is not None:
+            if (
+                found := self._domain_objects.find(".//protocols/zig_bee_coordinator")
+            ) is not None:
                 appl.zigbee_mac = found.find("mac_address").text
 
             # Also, collect regulation_modes and check for cooling, indicating cooling-mode is present
@@ -463,7 +470,9 @@ def _appl_dhw_mode_info(self, appl: Munch, appliance: etree) -> Munch:
         Collect dhw control operation modes - Anna + Loria.
         """
         dhw_mode_list: list[str] = []
-        locator = "./actuator_functionalities/domestic_hot_water_mode_control_functionality"
+        locator = (
+            "./actuator_functionalities/domestic_hot_water_mode_control_functionality"
+        )
         if (search := appliance.find(locator)) is not None:
             if search.find("allowed_modes") is not None:
                 for mode in search.find("allowed_modes"):
@@ -510,7 +519,7 @@ def _get_measurement_data(self, entity_id: str) -> GwEntityData:
         # !! DON'T CHANGE below two if-lines, will break stuff !!
         if self.smile_type == "power":
             if entity["dev_class"] == "smartmeter":
-                 data.update(self._power_data_from_location(entity["location"]))
+                data.update(self._power_data_from_location(entity["location"]))
 
             return data
 
@@ -641,8 +650,11 @@ def _get_actuator_functionalities(
             # Skip max_dhw_temperature, not initially valid,
             # skip thermostat for all but zones with thermostats
             if item == "max_dhw_temperature" or (
-                item == "thermostat" and (
-                    entity["dev_class"] != "climate" if self.smile(ADAM) else entity["dev_class"] != "thermostat"
+                item == "thermostat"
+                and (
+                    entity["dev_class"] != "climate"
+                    if self.smile(ADAM)
+                    else entity["dev_class"] != "thermostat"
                 )
             ):
                 continue
@@ -800,7 +812,9 @@ def _update_elga_cooling(self, data: GwEntityData) -> None:
             data["model"] = "Generic heater/cooler"
             # Cooling_enabled in xml does NOT show the correct status!
             # Setting it specifically:
-            self._cooling_enabled = data["binary_sensors"]["cooling_enabled"] = data["elga_status_code"] in (8, 9)
+            self._cooling_enabled = data["binary_sensors"]["cooling_enabled"] = data[
+                "elga_status_code"
+            ] in (8, 9)
             data["binary_sensors"]["cooling_state"] = self._cooling_active = (
                 data["elga_status_code"] == 8
             )
@@ -816,11 +830,15 @@ def _update_loria_cooling(self, data: GwEntityData) -> None:
         """Loria/Thermastage: base cooling-related on cooling_state and modulation_level."""
         # For Loria/Thermastage it's not clear if cooling_enabled in xml shows the correct status,
         # setting it specifically:
-        self._cooling_enabled = data["binary_sensors"]["cooling_enabled"] = data["binary_sensors"]["cooling_state"]
+        self._cooling_enabled = data["binary_sensors"]["cooling_enabled"] = data[
+            "binary_sensors"
+        ]["cooling_state"]
         self._cooling_active = data["sensors"]["modulation_level"] == 100
         # For Loria the above does not work (pw-beta issue #301)
         if "cooling_ena_switch" in data["switches"]:
-            self._cooling_enabled = data["binary_sensors"]["cooling_enabled"] = data["switches"]["cooling_ena_switch"]
+            self._cooling_enabled = data["binary_sensors"]["cooling_enabled"] = data[
+                "switches"
+            ]["cooling_ena_switch"]
             self._cooling_active = data["binary_sensors"]["cooling_state"]
 
     def _cleanup_data(self, data: GwEntityData) -> None:
@@ -870,7 +888,10 @@ def _scan_thermostats(self) -> None:
                     "dev_class": "climate",
                     "model": "ThermoZone",
                     "name": loc_data["name"],
-                    "thermostats": {"primary": loc_data["primary"], "secondary": loc_data["secondary"]},
+                    "thermostats": {
+                        "primary": loc_data["primary"],
+                        "secondary": loc_data["secondary"],
+                    },
                     "vendor": "Plugwise",
                 }
                 self._count += 3
@@ -910,10 +931,12 @@ def _rank_thermostat(
             if thermo_matching[appl_class] == thermo_loc["primary_prio"]:
                 thermo_loc["primary"].append(appliance_id)
             # Pre-elect new primary
-            elif (thermo_rank := thermo_matching[appl_class]) > thermo_loc["primary_prio"]:
+            elif (thermo_rank := thermo_matching[appl_class]) > thermo_loc[
+                "primary_prio"
+            ]:
                 thermo_loc["primary_prio"] = thermo_rank
                 # Demote former primary
-                if (tl_primary := thermo_loc["primary"]):
+                if tl_primary := thermo_loc["primary"]:
                     thermo_loc["secondary"] += tl_primary
                     thermo_loc["primary"] = []
 
@@ -1010,9 +1033,17 @@ def _rule_ids_by_name(self, name: str, loc_id: str) -> dict[str, dict[str, str]]
         for rule in self._domain_objects.findall(f'./rule[name="{name}"]'):
             active = rule.find("active").text
             if rule.find(locator) is not None:
-                schedule_ids[rule.attrib["id"]] = {"location": loc_id, "name": name, "active": active}
+                schedule_ids[rule.attrib["id"]] = {
+                    "location": loc_id,
+                    "name": name,
+                    "active": active,
+                }
             else:
-                schedule_ids[rule.attrib["id"]] = {"location": NONE, "name": name, "active": active}
+                schedule_ids[rule.attrib["id"]] = {
+                    "location": NONE,
+                    "name": name,
+                    "active": active,
+                }
 
         return schedule_ids
 
@@ -1029,9 +1060,17 @@ def _rule_ids_by_tag(self, tag: str, loc_id: str) -> dict[str, dict[str, str]]:
                 name = rule.find("name").text
                 active = rule.find("active").text
                 if rule.find(locator2) is not None:
-                    schedule_ids[rule.attrib["id"]] = {"location": loc_id, "name": name, "active": active}
+                    schedule_ids[rule.attrib["id"]] = {
+                        "location": loc_id,
+                        "name": name,
+                        "active": active,
+                    }
                 else:
-                    schedule_ids[rule.attrib["id"]] = {"location": NONE, "name": name, "active": active}
+                    schedule_ids[rule.attrib["id"]] = {
+                        "location": NONE,
+                        "name": name,
+                        "active": active,
+                    }
 
         return schedule_ids
 
diff --git a/plugwise/legacy/data.py b/plugwise/legacy/data.py
index 66b089ead..cc26ec534 100644
--- a/plugwise/legacy/data.py
+++ b/plugwise/legacy/data.py
@@ -2,6 +2,7 @@
 
 Plugwise Smile protocol data-collection helpers for legacy devices.
 """
+
 from __future__ import annotations
 
 # Dict as class
diff --git a/plugwise/legacy/helper.py b/plugwise/legacy/helper.py
index 861b943dd..832b6dd5a 100644
--- a/plugwise/legacy/helper.py
+++ b/plugwise/legacy/helper.py
@@ -2,6 +2,7 @@
 
 Plugwise Smile protocol helpers.
 """
+
 from __future__ import annotations
 
 from typing import cast
@@ -169,10 +170,7 @@ def _all_locations(self) -> None:
             loc.loc_id = location.attrib["id"]
             # Filter the valid single location for P1 legacy: services not empty
             locator = "./services"
-            if (
-                self.smile_type == "power"
-                and len(location.find(locator)) == 0
-            ):
+            if self.smile_type == "power" and len(location.find(locator)) == 0:
                 continue
 
             if loc.name == "Home":
@@ -212,15 +210,15 @@ def _create_legacy_gateway(self) -> None:
     def _appliance_info_finder(self, appliance: etree, appl: Munch) -> Munch:
         """Collect entity info (Smile/Stretch, Thermostats, OpenTherm/On-Off): firmware, model and vendor name."""
         match appl.pwclass:
-        # Collect thermostat entity info
+            # Collect thermostat entity info
             case _ as dev_class if dev_class in THERMOSTAT_CLASSES:
                 return self._appl_thermostat_info(appl, appliance, self._modules)
-        # Collect heater_central entity info
+            # Collect heater_central entity info
             case "heater_central":
                 return self._appl_heater_central_info(
                     appl, appliance, True, self._appliances, self._modules
                 )  # True means legacy device
-        # Collect info from Stretches
+            # Collect info from Stretches
             case _:
                 return self._energy_entity_info_finder(appliance, appl)
 
@@ -231,7 +229,9 @@ def _energy_entity_info_finder(self, appliance: etree, appl: Munch) -> Munch:
         """
         if self.smile_type in ("power", "stretch"):
             locator = "./services/electricity_point_meter"
-            module_data = self._get_module_data(appliance, locator, self._modules, legacy=True)
+            module_data = self._get_module_data(
+                appliance, locator, self._modules, legacy=True
+            )
             appl.zigbee_mac = module_data["zigbee_mac_address"]
             # Filter appliance without zigbee_mac, it's an orphaned device
             if appl.zigbee_mac is None and self.smile_type != "power":
@@ -362,10 +362,7 @@ def _appliance_measurements(
         self._count_data_items(data)
 
     def _get_actuator_functionalities(
-        self,
-        xml: etree,
-        entity: GwEntityData,
-        data: GwEntityData
+        self, xml: etree, entity: GwEntityData, data: GwEntityData
     ) -> None:
         """Helper-function for _get_measurement_data()."""
         for item in ACTIVE_ACTUATORS:
@@ -458,7 +455,9 @@ def _schedules(self) -> tuple[list[str], str]:
             active = result.text == "on"
 
         # Show an empty schedule as no schedule found
-        directives = search.find(f'./rule[@id="{rule_id}"]/directives/when/then') is not None
+        directives = (
+            search.find(f'./rule[@id="{rule_id}"]/directives/when/then') is not None
+        )
         if directives and name is not None:
             available = [name, OFF]
             selected = name if active else OFF
diff --git a/plugwise/legacy/smile.py b/plugwise/legacy/smile.py
index c1df96fdc..5afe5690d 100644
--- a/plugwise/legacy/smile.py
+++ b/plugwise/legacy/smile.py
@@ -2,6 +2,7 @@
 
 Plugwise backend module for Home Assistant Core - covering the legacy P1, Anna, and Stretch devices.
 """
+
 from __future__ import annotations
 
 from collections.abc import Awaitable, Callable
@@ -138,9 +139,9 @@ async def async_update(self) -> PlugwiseData:
             gateway=self.gw_data,
         )
 
-########################################################################################################
-###  API Set and HA Service-related Functions                                                        ###
-########################################################################################################
+    ########################################################################################################
+    ###  API Set and HA Service-related Functions                                                        ###
+    ########################################################################################################
 
     async def delete_notification(self) -> None:
         """Set-function placeholder for legacy devices."""
@@ -181,12 +182,16 @@ async def set_preset(self, _: str, preset: str) -> None:
     async def set_regulation_mode(self, mode: str) -> None:
         """Set-function placeholder for legacy devices."""
 
-    async def set_select(self, key: str, loc_id: str, option: str, state: str | None) -> None:
+    async def set_select(
+        self, key: str, loc_id: str, option: str, state: str | None
+    ) -> None:
         """Set the thermostat schedule option."""
         # schedule name corresponds to select option
         await self.set_schedule_state("dummy", state, option)
 
-    async def set_schedule_state(self, _: str, state: str | None, name: str | None) -> None:
+    async def set_schedule_state(
+        self, _: str, state: str | None, name: str | None
+    ) -> None:
         """Activate/deactivate the Schedule.
 
         Determined from - DOMAIN_OBJECTS.
@@ -205,7 +210,9 @@ async def set_schedule_state(self, _: str, state: str | None, name: str | None)
                 schedule_rule_id = rule.attrib["id"]
 
         if schedule_rule_id is None:
-            raise PlugwiseError("Plugwise: no schedule with this name available.")  # pragma: no cover
+            raise PlugwiseError(
+                "Plugwise: no schedule with this name available."
+            )  # pragma: no cover
 
         new_state = "false"
         if state == "on":
diff --git a/plugwise/smile.py b/plugwise/smile.py
index bea641f04..9f20bfd3d 100644
--- a/plugwise/smile.py
+++ b/plugwise/smile.py
@@ -2,6 +2,7 @@
 
 Plugwise backend module for Home Assistant Core.
 """
+
 from __future__ import annotations
 
 from collections.abc import Awaitable, Callable
@@ -94,7 +95,6 @@ def __init__(
         self.smile_version = smile_version
         SmileData.__init__(self)
 
-
     async def full_xml_update(self) -> None:
         """Perform a first fetch of all XML data, needed for initialization."""
         self._domain_objects = await self.request(DOMAIN_OBJECTS)
@@ -132,14 +132,16 @@ async def async_update(self) -> PlugwiseData:
             await self.full_xml_update()
             self.get_all_gateway_entities()
             # Set self._cooling_enabled -required for set_temperature,
-            #also, check for a failed data-retrieval
+            # also, check for a failed data-retrieval
             if "heater_id" in self.gw_data:
                 heat_cooler = self.gw_entities[self.gw_data["heater_id"]]
                 if (
                     "binary_sensors" in heat_cooler
                     and "cooling_enabled" in heat_cooler["binary_sensors"]
                 ):
-                    self._cooling_enabled = heat_cooler["binary_sensors"]["cooling_enabled"]
+                    self._cooling_enabled = heat_cooler["binary_sensors"][
+                        "cooling_enabled"
+                    ]
         except KeyError as err:
             raise DataMissingError("No Plugwise data received") from err
 
@@ -148,9 +150,9 @@ async def async_update(self) -> PlugwiseData:
             gateway=self.gw_data,
         )
 
-########################################################################################################
-###  API Set and HA Service-related Functions                                                        ###
-########################################################################################################
+    ########################################################################################################
+    ###  API Set and HA Service-related Functions                                                        ###
+    ########################################################################################################
 
     async def delete_notification(self) -> None:
         """Delete the active Plugwise Notification."""
@@ -222,7 +224,9 @@ async def set_preset(self, loc_id: str, preset: str) -> None:
 
         await self.call_request(uri, method="put", data=data)
 
-    async def set_select(self, key: str, loc_id: str, option: str, state: str | None) -> None:
+    async def set_select(
+        self, key: str, loc_id: str, option: str, state: str | None
+    ) -> None:
         """Set a dhw/gateway/regulation mode or the thermostat schedule option."""
         match key:
             case "select_dhw_mode":
@@ -254,7 +258,12 @@ async def set_gateway_mode(self, mode: str) -> None:
         valid = ""
         if mode == "away":
             time_1 = self._domain_objects.find("./gateway/time").text
-            away_time = dt.datetime.fromisoformat(time_1).astimezone(dt.UTC).isoformat(timespec="milliseconds").replace("+00:00", "Z")
+            away_time = (
+                dt.datetime.fromisoformat(time_1)
+                .astimezone(dt.UTC)
+                .isoformat(timespec="milliseconds")
+                .replace("+00:00", "Z")
+            )
             valid = (
                 f"<valid_from>{away_time}</valid_from><valid_to>{end_time}</valid_to>"
             )
@@ -448,8 +457,8 @@ async def set_temperature(self, loc_id: str, items: dict[str, float]) -> None:
 
         if setpoint is None:
             raise PlugwiseError(
-                    "Plugwise: failed setting temperature: no valid input provided"
-                )  # pragma: no cover"
+                "Plugwise: failed setting temperature: no valid input provided"
+            )  # pragma: no cover"
 
         temperature = str(setpoint)
         uri = self._thermostat_uri(loc_id)
diff --git a/plugwise/util.py b/plugwise/util.py
index 7beec330e..e2d1a125a 100644
--- a/plugwise/util.py
+++ b/plugwise/util.py
@@ -1,4 +1,5 @@
 """Plugwise protocol helpers."""
+
 from __future__ import annotations
 
 import datetime as dt
@@ -41,9 +42,7 @@ def check_alternative_location(loc: Munch, legacy: bool) -> Munch:
             loc.found = False
             return loc
 
-        loc.locator = (
-            f'./{loc.log_type}[type="{loc.measurement}"]/period/measurement'
-        )
+        loc.locator = f'./{loc.log_type}[type="{loc.measurement}"]/period/measurement'
         if legacy:
             loc.locator = (
                 f"./{loc.meas_list[0]}_{loc.log_type}/"
@@ -67,11 +66,11 @@ def in_alternative_location(loc: Munch, legacy: bool) -> bool:
     """
     present = "log" in loc.log_type and (
         "gas" in loc.measurement or "phase" in loc.measurement
-        )
+    )
     if legacy:
         present = "meter" in loc.log_type and (
             "point" in loc.log_type or "gas" in loc.measurement
-            )
+        )
 
     return present
 
@@ -222,8 +221,7 @@ def skip_obsolete_measurements(xml: etree, measurement: str) -> bool:
     locator = f".//logs/point_log[type='{measurement}']/updated_date"
     if (
         measurement in OBSOLETE_MEASUREMENTS
-        and (updated_date_key := xml.find(locator))
-        is not None
+        and (updated_date_key := xml.find(locator)) is not None
     ):
         updated_date = updated_date_key.text.split("T")[0]
         date_1 = dt.datetime.strptime(updated_date, "%Y-%m-%d")
diff --git a/pyproject.toml b/pyproject.toml
index 8c0243c41..b6010826c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -47,60 +47,55 @@ include-package-data = true
 [tool.setuptools.packages.find]
 include = ["plugwise*"]
 
-[tool.black]
-target-version = ["py313"]
-exclude = 'generated'
-
-[tool.isort]
-# https://github.com/PyCQA/isort/wiki/isort-Settings
-profile = "black"
-# will group `import x` and `from x import` of the same module.
-force_sort_within_sections = true
-known_first_party = [
-    "plugwise",
-    "homeassistant",
-    "tests",
-]
-forced_separate = [
-    "tests",
-]
-combine_as_imports = true
+##
+# Below this mark should be relatively in line with Core
+##
+# Added
+# 20241208: W0201 / attribute-defined-outside-init
+# 20241208: R1702 / too-many-nested-blocks # too many nested blocks in test_init 8/5
+# 20241208: R6102 / consider-using-tuple
+# 20241208: Recommended disabling => "implicit-str-concat", # ISC001 - 2 occurances!
+##
 
-[tool.pylint.MASTER]
-ignore = [
-    "tests",
-]
+[tool.pylint.MAIN]
+py-version = "3.13"
 # Use a conservative default here; 2 should speed up most setups and not hurt
 # any too bad. Override on command line as appropriate.
-# Disabled for now: https://github.com/PyCQA/pylint/issues/3584
 jobs = 2
+init-hook = """\
+    from pathlib import Path; \
+    import sys; \
+
+    from pylint.config import find_default_config_files; \
+
+    sys.path.append( \
+        str(Path(next(find_default_config_files())).parent.joinpath('pylint/plugins'))
+    ) \
+    """
 load-plugins = [
     "pylint.extensions.code_style",
     "pylint.extensions.typing",
+    "pylint_per_file_ignores",
 ]
 persistent = false
-extension-pkg-whitelist = [
+extension-pkg-allow-list = [
+    "av.audio.stream",
+    "av.logging",
+    "av.stream",
     "ciso8601",
+    "orjson",
     "cv2",
 ]
+fail-on = [
+    "I",
+]
 
 [tool.pylint.BASIC]
-good-names = [
-    "_",
-    "ev",
-    "ex",
-    "fp",
-    "i",
-    "id",
-    "j",
-    "k",
-    "Run",
-    "T",
-]
+class-const-naming-style = "any"
 
 [tool.pylint."MESSAGES CONTROL"]
 # Reasons disabled:
-# format - handled by black
+# format - handled by ruff
 # locally-disabled - it spams too much
 # duplicate-code - unavoidable
 # cyclic-import - doesn't test if both import on load
@@ -112,45 +107,271 @@ good-names = [
 # inconsistent-return-statements - doesn't handle raise
 # too-many-ancestors - it's too strict.
 # wrong-import-order - isort guards this
+# possibly-used-before-assignment - too many errors / not necessarily issues
+# ---
+# Pylint CodeStyle plugin
+# consider-using-namedtuple-or-dataclass - too opinionated
+# consider-using-assignment-expr - decision to use := better left to devs
 disable = [
+
+    # Plugwise
+    "attribute-defined-outside-init", # W0201
+    "too-many-nested-blocks", #R1702
+    "consider-using-tuple", #R6102
+
+    # Generic
+    "format",
     "abstract-method",
-    "consider-using-f-string",
     "cyclic-import",
     "duplicate-code",
-    "fixme",
-    "format",
     "inconsistent-return-statements",
     "locally-disabled",
-    "missing-class-docstring",
-    "missing-function-docstring",
-    "missing-module-docstring",
     "not-context-manager",
-    "raise-missing-from",
     "too-few-public-methods",
     "too-many-ancestors",
     "too-many-arguments",
-    "too-many-boolean-expressions",
-    "too-many-branches",
     "too-many-instance-attributes",
     "too-many-lines",
     "too-many-locals",
-    "too-many-positional-arguments",
     "too-many-public-methods",
-    "too-many-return-statements",
-    "too-many-statements",
-    "too-many-nested-blocks",
-    "unused-argument",
+    "too-many-boolean-expressions",
+    "too-many-positional-arguments",
     "wrong-import-order",
+    "consider-using-namedtuple-or-dataclass",
+    "consider-using-assignment-expr",
+    "possibly-used-before-assignment",
+
+    # Handled by ruff
+    # Ref: <https://github.com/astral-sh/ruff/issues/970>
+    "await-outside-async", # PLE1142
+    "bad-str-strip-call", # PLE1310
+    "bad-string-format-type", # PLE1307
+    "bidirectional-unicode", # PLE2502
+    "continue-in-finally", # PLE0116
+    "duplicate-bases", # PLE0241
+    "misplaced-bare-raise", # PLE0704
+    "format-needs-mapping", # F502
+    "function-redefined", # F811
+    # Needed because ruff does not understand type of __all__ generated by a function
+    # "invalid-all-format", # PLE0605
+    "invalid-all-object", # PLE0604
+    "invalid-character-backspace", # PLE2510
+    "invalid-character-esc", # PLE2513
+    "invalid-character-nul", # PLE2514
+    "invalid-character-sub", # PLE2512
+    "invalid-character-zero-width-space", # PLE2515
+    "logging-too-few-args", # PLE1206
+    "logging-too-many-args", # PLE1205
+    "missing-format-string-key", # F524
+    "mixed-format-string", # F506
+    "no-method-argument", # N805
+    "no-self-argument", # N805
+    "nonexistent-operator", # B002
+    "nonlocal-without-binding", # PLE0117
+    "not-in-loop", # F701, F702
+    "notimplemented-raised", # F901
+    "return-in-init", # PLE0101
+    "return-outside-function", # F706
+    "syntax-error", # E999
+    "too-few-format-args", # F524
+    "too-many-format-args", # F522
+    "too-many-star-expressions", # F622
+    "truncated-format-string", # F501
+    "undefined-all-variable", # F822
+    "undefined-variable", # F821
+    "used-prior-global-declaration", # PLE0118
+    "yield-inside-async-function", # PLE1700
+    "yield-outside-function", # F704
+    "anomalous-backslash-in-string", # W605
+    "assert-on-string-literal", # PLW0129
+    "assert-on-tuple", # F631
+    "bad-format-string", # W1302, F
+    "bad-format-string-key", # W1300, F
+    "bare-except", # E722
+    "binary-op-exception", # PLW0711
+    "cell-var-from-loop", # B023
+    # "dangerous-default-value", # B006, ruff catches new occurrences, needs more work
+    "duplicate-except", # B014
+    "duplicate-key", # F601
+    "duplicate-string-formatting-argument", # F
+    "duplicate-value", # F
+    "eval-used", # S307
+    "exec-used", # S102
+    "expression-not-assigned", # B018
+    "f-string-without-interpolation", # F541
+    "forgotten-debug-statement", # T100
+    "format-string-without-interpolation", # F
+    # "global-statement", # PLW0603, ruff catches new occurrences, needs more work
+    "global-variable-not-assigned", # PLW0602
+    # "implicit-str-concat", # ISC001
+    "import-self", # PLW0406
+    "inconsistent-quotes", # Q000
+    "invalid-envvar-default", # PLW1508
+    "keyword-arg-before-vararg", # B026
+    "logging-format-interpolation", # G
+    "logging-fstring-interpolation", # G
+    "logging-not-lazy", # G
+    "misplaced-future", # F404
+    "named-expr-without-context", # PLW0131
+    "nested-min-max", # PLW3301
+    "pointless-statement", # B018
+    "raise-missing-from", # B904
+    "redefined-builtin", # A001
+    "try-except-raise", # TRY302
+    "unused-argument", # ARG001, we don't use it
+    "unused-format-string-argument", #F507
+    "unused-format-string-key", # F504
+    "unused-import", # F401
+    "unused-variable", # F841
+    "useless-else-on-loop", # PLW0120
+    "wildcard-import", # F403
+    "bad-classmethod-argument", # N804
+    "consider-iterating-dictionary", # SIM118
+    "empty-docstring", # D419
+    "invalid-name", # N815
+    "line-too-long", # E501, disabled globally
+    "missing-class-docstring", # D101
+    "missing-final-newline", # W292
+    "missing-function-docstring", # D103
+    "missing-module-docstring", # D100
+    "multiple-imports", #E401
+    "singleton-comparison", # E711, E712
+    "subprocess-run-check", # PLW1510
+    "superfluous-parens", # UP034
+    "ungrouped-imports", # I001
+    "unidiomatic-typecheck", # E721
+    "unnecessary-direct-lambda-call", # PLC3002
+    "unnecessary-lambda-assignment", # PLC3001
+    "unnecessary-pass", # PIE790
+    "unneeded-not", # SIM208
+    "useless-import-alias", # PLC0414
+    "wrong-import-order", # I001
+    "wrong-import-position", # E402
+    "comparison-of-constants", # PLR0133
+    "comparison-with-itself", # PLR0124
+    "consider-alternative-union-syntax", # UP007
+    "consider-merging-isinstance", # PLR1701
+    "consider-using-alias", # UP006
+    "consider-using-dict-comprehension", # C402
+    "consider-using-generator", # C417
+    "consider-using-get", # SIM401
+    "consider-using-set-comprehension", # C401
+    "consider-using-sys-exit", # PLR1722
+    "consider-using-ternary", # SIM108
+    "literal-comparison", # F632
+    "property-with-parameters", # PLR0206
+    "super-with-arguments", # UP008
+    "too-many-branches", # PLR0912
+    "too-many-return-statements", # PLR0911
+    "too-many-statements", # PLR0915
+    "trailing-comma-tuple", # COM818
+    "unnecessary-comprehension", # C416
+    "use-a-generator", # C417
+    "use-dict-literal", # C406
+    "use-list-literal", # C405
+    "useless-object-inheritance", # UP004
+    "useless-return", # PLR1711
+    "no-else-break", # RET508
+    "no-else-continue", # RET507
+    "no-else-raise", # RET506
+    "no-else-return", # RET505
+    "broad-except", # BLE001
+    "protected-access", # SLF001
+    "broad-exception-raised", # TRY002
+    "consider-using-f-string", # PLC0209
+    # "no-self-use", # PLR6301  # Optional plugin, not enabled
+
+    # Handled by mypy
+    # Ref: <https://github.com/antonagestam/pylint-mypy-overlap>
+    "abstract-class-instantiated",
+    "arguments-differ",
+    "assigning-non-slot",
+    "assignment-from-no-return",
+    "assignment-from-none",
+    "bad-exception-cause",
+    "bad-format-character",
+    "bad-reversed-sequence",
+    "bad-super-call",
+    "bad-thread-instantiation",
+    "catching-non-exception",
+    "comparison-with-callable",
+    "deprecated-class",
+    "dict-iter-missing-items",
+    "format-combined-specification",
+    "global-variable-undefined",
+    "import-error",
+    "inconsistent-mro",
+    "inherit-non-class",
+    "init-is-generator",
+    "invalid-class-object",
+    "invalid-enum-extension",
+    "invalid-envvar-value",
+    "invalid-format-returned",
+    "invalid-hash-returned",
+    "invalid-metaclass",
+    "invalid-overridden-method",
+    "invalid-repr-returned",
+    "invalid-sequence-index",
+    "invalid-slice-index",
+    "invalid-slots-object",
+    "invalid-slots",
+    "invalid-star-assignment-target",
+    "invalid-str-returned",
+    "invalid-unary-operand-type",
+    "invalid-unicode-codec",
+    "isinstance-second-argument-not-valid-type",
+    "method-hidden",
+    "misplaced-format-function",
+    "missing-format-argument-key",
+    "missing-format-attribute",
+    "missing-kwoa",
+    "no-member",
+    "no-value-for-parameter",
+    "non-iterator-returned",
+    "non-str-assignment-to-dunder-name",
+    "nonlocal-and-global",
+    "not-a-mapping",
+    "not-an-iterable",
+    "not-async-context-manager",
+    "not-callable",
+    "not-context-manager",
+    "overridden-final-method",
+    "raising-bad-type",
+    "raising-non-exception",
+    "redundant-keyword-arg",
+    "relative-beyond-top-level",
+    "self-cls-assignment",
+    "signature-differs",
+    "star-needs-assignment-target",
+    "subclassed-final-class",
+    "super-without-brackets",
+    "too-many-function-args",
+    "typevar-double-variance",
+    "typevar-name-mismatch",
+    "unbalanced-dict-unpacking",
+    "unbalanced-tuple-unpacking",
+    "unexpected-keyword-arg",
+    "unhashable-member",
+    "unpacking-non-sequence",
+    "unsubscriptable-object",
+    "unsupported-assignment-operation",
+    "unsupported-binary-operation",
+    "unsupported-delete-operation",
+    "unsupported-membership-test",
+    "used-before-assignment",
+    "using-final-decorator-in-unsupported-version",
+    "wrong-exception-operation",
 ]
-# for now (20201031) added the below while we are codemerging/-improving
-# missing-class-docstring
-# missing-function-docstring
-# missing-module-docstring
-# too-many-nested-blocks => inherent with fixing complexity
 enable = [
     #"useless-suppression",  # temporarily every now and then to clean them up
     "use-symbolic-message-instead",
 ]
+per-file-ignores = [
+    # redefined-outer-name: Tests reference fixtures in the test function
+    # use-implicit-booleaness-not-comparison: Tests need to validate that a list
+    # or a dict is returned
+    "/tests/:redefined-outer-name,use-implicit-booleaness-not-comparison",
+]
 
 [tool.pylint.REPORTS]
 score = false
@@ -159,6 +380,7 @@ score = false
 ignored-classes = [
     "_CountingAttr",  # for attrs
 ]
+mixin-class-rgx = ".*[Mm]ix[Ii]n"
 
 [tool.pylint.FORMAT]
 expected-line-ending-format = "LF"
@@ -167,23 +389,15 @@ expected-line-ending-format = "LF"
 overgeneral-exceptions = [
     "builtins.BaseException",
     "builtins.Exception",
+    # "homeassistant.exceptions.HomeAssistantError",  # too many issues
 ]
 
-[tool.pytest.ini_options]
-asyncio_default_fixture_loop_scope = "function"
-asyncio_mode = "strict"
-markers = [
-    # mark a test as a asynchronous io test.
-    "asyncio",
-]
+[tool.pylint.TYPING]
+runtime-typing = false
+
+[tool.pylint.CODE_STYLE]
+max-line-length-suggestions = 72
 
-testpaths = [
-    "tests",
-]
-norecursedirs = [
-    ".git",
-    "testing_config",
-]
 
 [tool.mypy]
 python_version = "3.13"
@@ -235,7 +449,7 @@ lint.select = [
     "G", # flake8-logging-format
     "I",  # isort
     "ICN001", # import concentions; {name} should be imported as {asname}
-    "ISC001", # Implicitly concatenated string literals on one line
+    # "ISC001", # Implicitly concatenated string literals on one line
     "N804", # First argument of a class method should be named cls
     "N805", # First argument of a method should be named self
     "N815", # Variable {name} in class scope should not be mixedCase


Test patch:
diff --git a/scripts/tests_and_coverage.sh b/scripts/tests_and_coverage.sh
index c0d0d4f48..73be7e825 100755
--- a/scripts/tests_and_coverage.sh
+++ b/scripts/tests_and_coverage.sh
@@ -21,6 +21,18 @@ else
     exit 2
 fi
 
+handle_command_error() {
+    if [ $? -ne 0 ]; then
+        echo "Error: $1 failed"
+        exit 1
+    fi
+}
+
+biome_format() {
+    ./tmp/biome check fixtures/ plugwise/ tests/ --files-ignore-unknown=true --no-errors-on-unmatched --indent-width=2 --indent-style=space --write
+    handle_command_error "biome formatting"
+}
+
 # Install/update dependencies
 pre-commit install
 pre-commit install-hooks
@@ -32,26 +44,35 @@ set +u
 if [ -z "${GITHUB_ACTIONS}" ] || [ "$1" == "test_and_coverage" ] ; then
     # Python tests (rerun with debug if failures)
     PYTHONPATH=$(pwd) pytest -qx tests/ --cov='.' --no-cov-on-fail --cov-report term-missing || PYTHONPATH=$(pwd) pytest -xrpP --log-level debug tests/
+    handle_command_error "python code testing"
 fi
 
 if [ -z "${GITHUB_ACTIONS}" ] || [ "$1" == "linting" ] ; then
-    # Black first to ensure nothings roughing up ruff
-    echo "... ruff-ing ..."
+    echo "... biome-ing (prettier) ..."
+    biome_format
+
+    echo "... ruff checking ..."
     ruff check plugwise/ tests/
+    handle_command_error "ruff checking"
+    echo "... ruff formatting ..."
+    ruff format plugwise/ tests/
+    handle_command_error "ruff formatting"
 
     echo "... pylint-ing ..." 
     pylint plugwise/ tests/
+    handle_command_error "pylint validation"
 
     echo "... mypy-ing ..."
     mypy plugwise/
+    handle_command_error "mypy validation"
 fi
 
 # As to not generated fixtures, leaving biome to re-do them
 # so no auto-generation during github run of testing
 # Creating todo #313 to 'gracefully' do this on merge on github action
 if [ -z "${GITHUB_ACTIONS}" ] || [ "$1" == "fixtures" ] ; then
-   echo "... crafting manual fixtures ..." 
+   echo "... Crafting manual fixtures ..." 
    PYTHONPATH=$(pwd) python3 scripts/manual_fixtures.py
+    echo "... (re) biome-ing (prettier) ..."
+    biome_format
 fi
-echo "... biome-ing (fixtures and testdata) ..." 
-./tmp/biome lint --staged --files-ignore-unknown=true --no-errors-on-unmatched
diff --git a/tests/data/adam/adam_heatpump_cooling.json b/tests/data/adam/adam_heatpump_cooling.json
index bcd1fb4be..0dd1354b8 100644
--- a/tests/data/adam/adam_heatpump_cooling.json
+++ b/tests/data/adam/adam_heatpump_cooling.json
@@ -13,13 +13,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Slaapkamer SJ",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -33,9 +27,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "d3a276aeb3114a509bab1e4bf8c40348"
-        ],
+        "primary": ["d3a276aeb3114a509bab1e4bf8c40348"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -139,13 +131,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Slaapkamer DB",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -159,9 +145,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "47e2c550a33846b680725aa3fb229473"
-        ],
+        "primary": ["47e2c550a33846b680725aa3fb229473"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -261,13 +245,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Badkamer 2",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "Werkdag schema",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -280,9 +258,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "f04c985c11ad4848b8fcd710343f9dcf"
-        ],
+        "primary": ["f04c985c11ad4848b8fcd710343f9dcf"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -313,11 +289,7 @@
       },
       "dev_class": "gateway",
       "firmware": "3.2.8",
-      "gateway_modes": [
-        "away",
-        "full",
-        "vacation"
-      ],
+      "gateway_modes": ["away", "full", "vacation"],
       "hardware": "AME Smile 2.0 board",
       "location": "eedadcb297564f1483faa509179aebed",
       "mac_address": "012345670001",
@@ -414,13 +386,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Badkamer 1",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "Werkdag schema",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -434,9 +400,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "eac5db95d97241f6b17790897847ccf5"
-        ],
+        "primary": ["eac5db95d97241f6b17790897847ccf5"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -454,13 +418,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Slaapkamer RB",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 3.13,
@@ -473,9 +431,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "c4ed311d54e341f58b4cdd201d1fde7e"
-        ],
+        "primary": ["c4ed311d54e341f58b4cdd201d1fde7e"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -513,13 +469,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Slaapkamer SQ",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -533,9 +483,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "beb32da072274e698146db8b022f3c36"
-        ],
+        "primary": ["beb32da072274e698146db8b022f3c36"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -573,13 +521,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Keuken",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "Werkdag schema",
       "sensors": {
         "electricity_consumed": 2.13,
@@ -593,9 +535,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "ea8372c0e3ad4622ad45a041d02425f5"
-        ],
+        "primary": ["ea8372c0e3ad4622ad45a041d02425f5"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -613,13 +553,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Bijkeuken",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -633,9 +567,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "1053c8bbf8be43c6921742b146a625f1"
-        ],
+        "primary": ["1053c8bbf8be43c6921742b146a625f1"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -751,13 +683,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Slaapkamer JM",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -771,9 +697,7 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "7fda9f84f01342f8afe9ebbbbff30c0f"
-        ],
+        "primary": ["7fda9f84f01342f8afe9ebbbbff30c0f"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -861,13 +785,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Woonkamer",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "Werkdag schema",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -881,9 +799,7 @@
         "upper_bound": 35.0
       },
       "thermostats": {
-        "primary": [
-          "ca79d23ae0094120b877558734cff85c"
-        ],
+        "primary": ["ca79d23ae0094120b877558734cff85c"],
         "secondary": []
       },
       "vendor": "Plugwise"
diff --git a/tests/data/adam/adam_jip.json b/tests/data/adam/adam_jip.json
index 1e108eec4..6d021a276 100644
--- a/tests/data/adam/adam_jip.json
+++ b/tests/data/adam/adam_jip.json
@@ -6,13 +6,7 @@
       "control_state": "idle",
       "dev_class": "climate",
       "name": "Slaapkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "sensors": {
         "temperature": 24.2
       },
@@ -23,12 +17,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "1346fbd8498d4dbcab7e18d51b771f3d"
-        ],
-        "secondary": [
-          "356b65335e274d769c338223e7af9c33"
-        ]
+        "primary": ["1346fbd8498d4dbcab7e18d51b771f3d"],
+        "secondary": ["356b65335e274d769c338223e7af9c33"]
       }
     },
     "13228dab8ce04617af318a2888b3c548": {
@@ -37,13 +27,7 @@
       "control_state": "idle",
       "dev_class": "climate",
       "name": "Woonkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "sensors": {
         "temperature": 27.4
       },
@@ -54,12 +38,8 @@
         "upper_bound": 30.0
       },
       "thermostats": {
-        "primary": [
-          "f61f1a2535f54f52ad006a3d18e459ca"
-        ],
-        "secondary": [
-          "833de10f269c4deab58fb9df69901b4e"
-        ]
+        "primary": ["f61f1a2535f54f52ad006a3d18e459ca"],
+        "secondary": ["833de10f269c4deab58fb9df69901b4e"]
       }
     },
     "1346fbd8498d4dbcab7e18d51b771f3d": {
@@ -235,23 +215,14 @@
       },
       "dev_class": "gateway",
       "firmware": "3.2.8",
-      "gateway_modes": [
-        "away",
-        "full",
-        "vacation"
-      ],
+      "gateway_modes": ["away", "full", "vacation"],
       "hardware": "AME Smile 2.0 board",
       "location": "9e4433a9d69f40b3aefd15e74395eaec",
       "mac_address": "012345670001",
       "model": "Gateway",
       "model_id": "smile_open_therm",
       "name": "Adam",
-      "regulation_modes": [
-        "heating",
-        "off",
-        "bleeding_cold",
-        "bleeding_hot"
-      ],
+      "regulation_modes": ["heating", "off", "bleeding_cold", "bleeding_hot"],
       "select_gateway_mode": "full",
       "select_regulation_mode": "heating",
       "sensors": {
@@ -266,13 +237,7 @@
       "control_state": "idle",
       "dev_class": "climate",
       "name": "Kinderkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "sensors": {
         "temperature": 30.0
       },
@@ -283,12 +248,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "6f3e9d7084214c21b9dfa46f6eeb8700"
-        ],
-        "secondary": [
-          "d4496250d0e942cfa7aea3476e9070d5"
-        ]
+        "primary": ["6f3e9d7084214c21b9dfa46f6eeb8700"],
+        "secondary": ["d4496250d0e942cfa7aea3476e9070d5"]
       }
     },
     "d4496250d0e942cfa7aea3476e9070d5": {
@@ -321,13 +282,7 @@
       "control_state": "idle",
       "dev_class": "climate",
       "name": "Logeerkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "sensors": {
         "temperature": 30.0
       },
@@ -338,12 +293,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "a6abc6a129ee499c88a4d420cc413b47"
-        ],
-        "secondary": [
-          "1da4d325838e4ad8aac12177214505c9"
-        ]
+        "primary": ["a6abc6a129ee499c88a4d420cc413b47"],
+        "secondary": ["1da4d325838e4ad8aac12177214505c9"]
       }
     },
     "e4684553153b44afbef2200885f379dc": {
diff --git a/tests/data/adam/adam_multiple_devices_per_zone.json b/tests/data/adam/adam_multiple_devices_per_zone.json
index ea123e56b..523f9cfcc 100644
--- a/tests/data/adam/adam_multiple_devices_per_zone.json
+++ b/tests/data/adam/adam_multiple_devices_per_zone.json
@@ -36,13 +36,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Badkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "Badkamer Schema",
       "sensors": {
         "temperature": 18.9
@@ -77,13 +71,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Bios",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -97,12 +85,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "df4a4a8169904cdb9c03d61a21f42140"
-        ],
-        "secondary": [
-          "a2c3583e0a6349358998b760cea82d2a"
-        ]
+        "primary": ["df4a4a8169904cdb9c03d61a21f42140"],
+        "secondary": ["a2c3583e0a6349358998b760cea82d2a"]
       },
       "vendor": "Plugwise"
     },
@@ -142,13 +126,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Garage",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "off",
       "sensors": {
         "temperature": 15.6
@@ -160,9 +138,7 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "e7693eb9582644e5b865dba8d4447cf1"
-        ],
+        "primary": ["e7693eb9582644e5b865dba8d4447cf1"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -298,13 +274,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Jessie",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "CV Jessie",
       "sensors": {
         "temperature": 17.2
@@ -316,12 +286,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "6a3bf693d05e48e0b460c815a4fdd09d"
-        ],
-        "secondary": [
-          "d3da73bde12a47d5a6b8f9dad971f2ec"
-        ]
+        "primary": ["6a3bf693d05e48e0b460c815a4fdd09d"],
+        "secondary": ["d3da73bde12a47d5a6b8f9dad971f2ec"]
       },
       "vendor": "Plugwise"
     },
@@ -453,13 +419,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Woonkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "GF7  Woonkamer",
       "sensors": {
         "electricity_consumed": 35.6,
@@ -473,12 +433,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "b59bcebaf94b499ea7d46e4a66fb62d8"
-        ],
-        "secondary": [
-          "b310b72a0e354bfab43089919b9a88bf"
-        ]
+        "primary": ["b59bcebaf94b499ea7d46e4a66fb62d8"],
+        "secondary": ["b310b72a0e354bfab43089919b9a88bf"]
       },
       "vendor": "Plugwise"
     },
diff --git a/tests/data/adam/adam_onoff_cooling_fake_firmware.json b/tests/data/adam/adam_onoff_cooling_fake_firmware.json
index 414208da8..612e5caa5 100644
--- a/tests/data/adam/adam_onoff_cooling_fake_firmware.json
+++ b/tests/data/adam/adam_onoff_cooling_fake_firmware.json
@@ -43,11 +43,7 @@
       },
       "dev_class": "gateway",
       "firmware": "3.2.8",
-      "gateway_modes": [
-        "away",
-        "full",
-        "vacation"
-      ],
+      "gateway_modes": ["away", "full", "vacation"],
       "hardware": "AME Smile 2.0 board",
       "location": "eedadcb297564f1483faa509179aebed",
       "mac_address": "012345670001",
@@ -93,13 +89,7 @@
       "control_state": "idle",
       "dev_class": "climate",
       "name": "Woonkamer",
-      "preset_modes": [
-        "no_frost",
-        "vacation",
-        "away",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["no_frost", "vacation", "away", "home", "asleep"],
       "select_schedule": "Werkdag schema",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -113,9 +103,7 @@
         "upper_bound": 35.0
       },
       "thermostats": {
-        "primary": [
-          "ca79d23ae0094120b877558734cff85c"
-        ],
+        "primary": ["ca79d23ae0094120b877558734cff85c"],
         "secondary": []
       }
     }
diff --git a/tests/data/adam/adam_plus_anna.json b/tests/data/adam/adam_plus_anna.json
index 3256f5a87..bf471305e 100644
--- a/tests/data/adam/adam_plus_anna.json
+++ b/tests/data/adam/adam_plus_anna.json
@@ -2,22 +2,13 @@
   "devices": {
     "009490cc2f674ce6b576863fbb64f867": {
       "active_preset": "home",
-      "available_schedules": [
-        "Weekschema",
-        "off"
-      ],
+      "available_schedules": ["Weekschema", "off"],
       "climate_mode": "auto",
       "control_state": "idle",
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Living room",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "Weekschema",
       "sensors": {
         "electricity_consumed": 74.2,
@@ -31,9 +22,7 @@
         "upper_bound": 35.0
       },
       "thermostats": {
-        "primary": [
-          "ee62cad889f94e8ca3d09021f03a660b"
-        ],
+        "primary": ["ee62cad889f94e8ca3d09021f03a660b"],
         "secondary": []
       },
       "vendor": "Plugwise"
diff --git a/tests/data/adam/adam_plus_anna_new.json b/tests/data/adam/adam_plus_anna_new.json
index d67cf5763..22146d9f7 100644
--- a/tests/data/adam/adam_plus_anna_new.json
+++ b/tests/data/adam/adam_plus_anna_new.json
@@ -162,23 +162,14 @@
       },
       "dev_class": "gateway",
       "firmware": "3.7.8",
-      "gateway_modes": [
-        "away",
-        "full",
-        "vacation"
-      ],
+      "gateway_modes": ["away", "full", "vacation"],
       "hardware": "AME Smile 2.0 board",
       "location": "bc93488efab249e5bc54fd7e175a6f91",
       "mac_address": "012345679891",
       "model": "Gateway",
       "model_id": "smile_open_therm",
       "name": "Adam",
-      "regulation_modes": [
-        "bleeding_hot",
-        "bleeding_cold",
-        "off",
-        "heating"
-      ],
+      "regulation_modes": ["bleeding_hot", "bleeding_cold", "off", "heating"],
       "select_gateway_mode": "full",
       "select_regulation_mode": "heating",
       "sensors": {
@@ -238,13 +229,7 @@
       "control_state": "heating",
       "dev_class": "climate",
       "name": "Living room",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "home",
-        "away"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
       "select_schedule": "Weekschema",
       "sensors": {
         "electricity_consumed": 149.9,
@@ -258,9 +243,7 @@
         "upper_bound": 35.0
       },
       "thermostats": {
-        "primary": [
-          "ad4838d7d35c4d6ea796ee12ae5aedf8"
-        ],
+        "primary": ["ad4838d7d35c4d6ea796ee12ae5aedf8"],
         "secondary": []
       }
     },
@@ -277,13 +260,7 @@
       "control_state": "preheating",
       "dev_class": "climate",
       "name": "Bathroom",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "home",
-        "away"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
       "select_schedule": "Badkamer",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -297,12 +274,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "e2f4322d57924fa090fbbc48b3a140dc"
-        ],
-        "secondary": [
-          "1772a4ea304041adb83f357b751341ff"
-        ]
+        "primary": ["e2f4322d57924fa090fbbc48b3a140dc"],
+        "secondary": ["1772a4ea304041adb83f357b751341ff"]
       }
     }
   }
diff --git a/tests/data/adam/adam_plus_anna_new_UPDATED_DATA.json b/tests/data/adam/adam_plus_anna_new_UPDATED_DATA.json
index b924ec501..0fe9f13be 100644
--- a/tests/data/adam/adam_plus_anna_new_UPDATED_DATA.json
+++ b/tests/data/adam/adam_plus_anna_new_UPDATED_DATA.json
@@ -43,5 +43,5 @@
         "relay": false
       }
     }
-  }    
+  }
 }
diff --git a/tests/data/adam/adam_plus_anna_new_regulation_off.json b/tests/data/adam/adam_plus_anna_new_regulation_off.json
index e3e373186..c27d1e58d 100644
--- a/tests/data/adam/adam_plus_anna_new_regulation_off.json
+++ b/tests/data/adam/adam_plus_anna_new_regulation_off.json
@@ -162,23 +162,14 @@
       },
       "dev_class": "gateway",
       "firmware": "3.7.8",
-      "gateway_modes": [
-        "away",
-        "full",
-        "vacation"
-      ],
+      "gateway_modes": ["away", "full", "vacation"],
       "hardware": "AME Smile 2.0 board",
       "location": "bc93488efab249e5bc54fd7e175a6f91",
       "mac_address": "012345679891",
       "model": "Gateway",
       "model_id": "smile_open_therm",
       "name": "Adam",
-      "regulation_modes": [
-        "bleeding_hot",
-        "bleeding_cold",
-        "off",
-        "heating"
-      ],
+      "regulation_modes": ["bleeding_hot", "bleeding_cold", "off", "heating"],
       "select_gateway_mode": "full",
       "select_regulation_mode": "off",
       "sensors": {
@@ -238,13 +229,7 @@
       "control_state": "idle",
       "dev_class": "climate",
       "name": "Living room",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "home",
-        "away"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 149.9,
@@ -258,9 +243,7 @@
         "upper_bound": 35.0
       },
       "thermostats": {
-        "primary": [
-          "ad4838d7d35c4d6ea796ee12ae5aedf8"
-        ],
+        "primary": ["ad4838d7d35c4d6ea796ee12ae5aedf8"],
         "secondary": []
       }
     },
@@ -277,13 +260,7 @@
       "control_state": "idle",
       "dev_class": "climate",
       "name": "Bathroom",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "home",
-        "away"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -297,12 +274,8 @@
         "upper_bound": 99.9
       },
       "thermostats": {
-        "primary": [
-          "e2f4322d57924fa090fbbc48b3a140dc"
-        ],
-        "secondary": [
-          "1772a4ea304041adb83f357b751341ff"
-        ]
+        "primary": ["e2f4322d57924fa090fbbc48b3a140dc"],
+        "secondary": ["1772a4ea304041adb83f357b751341ff"]
       }
     }
   }
diff --git a/tests/data/adam/adam_zone_per_device.json b/tests/data/adam/adam_zone_per_device.json
index a41b14e55..b16d8807c 100644
--- a/tests/data/adam/adam_zone_per_device.json
+++ b/tests/data/adam/adam_zone_per_device.json
@@ -36,13 +36,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Badkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "Badkamer Schema",
       "sensors": {
         "temperature": 18.8
@@ -54,12 +48,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "f1fee6043d3642a9b0a65297455f008e"
-        ],
-        "secondary": [
-          "680423ff840043738f42cc7f1ff97a36"
-        ]
+        "primary": ["f1fee6043d3642a9b0a65297455f008e"],
+        "secondary": ["680423ff840043738f42cc7f1ff97a36"]
       },
       "vendor": "Plugwise"
     },
@@ -78,13 +68,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Bios",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "off",
       "sensors": {
         "electricity_consumed": 0.0,
@@ -98,12 +82,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "df4a4a8169904cdb9c03d61a21f42140"
-        ],
-        "secondary": [
-          "a2c3583e0a6349358998b760cea82d2a"
-        ]
+        "primary": ["df4a4a8169904cdb9c03d61a21f42140"],
+        "secondary": ["a2c3583e0a6349358998b760cea82d2a"]
       },
       "vendor": "Plugwise"
     },
@@ -143,13 +123,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Garage",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "off",
       "sensors": {
         "temperature": 15.6
@@ -161,9 +135,7 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "e7693eb9582644e5b865dba8d4447cf1"
-        ],
+        "primary": ["e7693eb9582644e5b865dba8d4447cf1"],
         "secondary": []
       },
       "vendor": "Plugwise"
@@ -299,13 +271,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Jessie",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "CV Jessie",
       "sensors": {
         "temperature": 17.1
@@ -317,12 +283,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "6a3bf693d05e48e0b460c815a4fdd09d"
-        ],
-        "secondary": [
-          "d3da73bde12a47d5a6b8f9dad971f2ec"
-        ]
+        "primary": ["6a3bf693d05e48e0b460c815a4fdd09d"],
+        "secondary": ["d3da73bde12a47d5a6b8f9dad971f2ec"]
       },
       "vendor": "Plugwise"
     },
@@ -454,13 +416,7 @@
       "dev_class": "climate",
       "model": "ThermoZone",
       "name": "Woonkamer",
-      "preset_modes": [
-        "home",
-        "asleep",
-        "away",
-        "vacation",
-        "no_frost"
-      ],
+      "preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
       "select_schedule": "GF7  Woonkamer",
       "sensors": {
         "electricity_consumed": 35.8,
@@ -474,12 +430,8 @@
         "upper_bound": 100.0
       },
       "thermostats": {
-        "primary": [
-          "b59bcebaf94b499ea7d46e4a66fb62d8"
-        ],
-        "secondary": [
-          "b310b72a0e354bfab43089919b9a88bf"
-        ]
+        "primary": ["b59bcebaf94b499ea7d46e4a66fb62d8"],
+        "secondary": ["b310b72a0e354bfab43089919b9a88bf"]
       },
       "vendor": "Plugwise"
     },
diff --git a/tests/data/anna/anna_elga_2.json b/tests/data/anna/anna_elga_2.json
index 6e7c93904..81755deae 100644
--- a/tests/data/anna/anna_elga_2.json
+++ b/tests/data/anna/anna_elga_2.json
@@ -37,10 +37,7 @@
     },
     "ebd90df1ab334565b5895f37590ccff4": {
       "active_preset": "home",
-      "available_schedules": [
-        "Thermostat schedule",
-        "off"
-      ],
+      "available_schedules": ["Thermostat schedule", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -48,13 +45,7 @@
       "location": "d3ce834534114348be628b61b26d9220",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "away",
-        "no_frost",
-        "vacation",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["away", "no_frost", "vacation", "home", "asleep"],
       "select_schedule": "Thermostat schedule",
       "sensors": {
         "cooling_activation_outdoor_temperature": 26.0,
diff --git a/tests/data/anna/anna_elga_2_cooling.json b/tests/data/anna/anna_elga_2_cooling.json
index 55afba51a..5bbb34643 100644
--- a/tests/data/anna/anna_elga_2_cooling.json
+++ b/tests/data/anna/anna_elga_2_cooling.json
@@ -37,10 +37,7 @@
     },
     "ebd90df1ab334565b5895f37590ccff4": {
       "active_preset": "home",
-      "available_schedules": [
-        "Thermostat schedule",
-        "off"
-      ],
+      "available_schedules": ["Thermostat schedule", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -48,13 +45,7 @@
       "location": "d3ce834534114348be628b61b26d9220",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "away",
-        "no_frost",
-        "vacation",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["away", "no_frost", "vacation", "home", "asleep"],
       "select_schedule": "Thermostat schedule",
       "sensors": {
         "cooling_activation_outdoor_temperature": 26.0,
diff --git a/tests/data/anna/anna_elga_2_cooling_UPDATED_DATA.json b/tests/data/anna/anna_elga_2_cooling_UPDATED_DATA.json
index 197989256..bc85a2976 100644
--- a/tests/data/anna/anna_elga_2_cooling_UPDATED_DATA.json
+++ b/tests/data/anna/anna_elga_2_cooling_UPDATED_DATA.json
@@ -37,10 +37,7 @@
     },
     "ebd90df1ab334565b5895f37590ccff4": {
       "active_preset": "home",
-      "available_schedules": [
-        "Thermostat schedule",
-        "off"
-      ],
+      "available_schedules": ["Thermostat schedule", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -48,13 +45,7 @@
       "location": "d3ce834534114348be628b61b26d9220",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "away",
-        "no_frost",
-        "vacation",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["away", "no_frost", "vacation", "home", "asleep"],
       "select_schedule": "Thermostat schedule",
       "sensors": {
         "cooling_activation_outdoor_temperature": 26.0,
diff --git a/tests/data/anna/anna_elga_2_schedule_off.json b/tests/data/anna/anna_elga_2_schedule_off.json
index 7e911ca2c..2c9851f5a 100644
--- a/tests/data/anna/anna_elga_2_schedule_off.json
+++ b/tests/data/anna/anna_elga_2_schedule_off.json
@@ -37,10 +37,7 @@
     },
     "ebd90df1ab334565b5895f37590ccff4": {
       "active_preset": "home",
-      "available_schedules": [
-        "Thermostat schedule",
-        "off"
-      ],
+      "available_schedules": ["Thermostat schedule", "off"],
       "climate_mode": "heat_cool",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -48,13 +45,7 @@
       "location": "d3ce834534114348be628b61b26d9220",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "away",
-        "no_frost",
-        "vacation",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["away", "no_frost", "vacation", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "cooling_activation_outdoor_temperature": 26.0,
diff --git a/tests/data/anna/anna_elga_no_cooling.json b/tests/data/anna/anna_elga_no_cooling.json
index 056ef3310..baf8c79c9 100644
--- a/tests/data/anna/anna_elga_no_cooling.json
+++ b/tests/data/anna/anna_elga_no_cooling.json
@@ -58,10 +58,7 @@
     },
     "3cb70739631c4d17a86b8b12e8a5161b": {
       "active_preset": "home",
-      "available_schedules": [
-        "standaard",
-        "off"
-      ],
+      "available_schedules": ["standaard", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -69,13 +66,7 @@
       "location": "c784ee9fdab44e1395b8dee7d7a497d5",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "home",
-        "away",
-        "asleep",
-        "vacation"
-      ],
+      "preset_modes": ["no_frost", "home", "away", "asleep", "vacation"],
       "select_schedule": "standaard",
       "sensors": {
         "cooling_activation_outdoor_temperature": 21.0,
diff --git a/tests/data/anna/anna_heatpump_cooling.json b/tests/data/anna/anna_heatpump_cooling.json
index 854a2ed01..8a04e9248 100644
--- a/tests/data/anna/anna_heatpump_cooling.json
+++ b/tests/data/anna/anna_heatpump_cooling.json
@@ -55,10 +55,7 @@
     },
     "3cb70739631c4d17a86b8b12e8a5161b": {
       "active_preset": "home",
-      "available_schedules": [
-        "standaard",
-        "off"
-      ],
+      "available_schedules": ["standaard", "off"],
       "climate_mode": "heat_cool",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -66,13 +63,7 @@
       "location": "c784ee9fdab44e1395b8dee7d7a497d5",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "home",
-        "away",
-        "asleep",
-        "vacation"
-      ],
+      "preset_modes": ["no_frost", "home", "away", "asleep", "vacation"],
       "select_schedule": "off",
       "sensors": {
         "cooling_activation_outdoor_temperature": 21.0,
diff --git a/tests/data/anna/anna_heatpump_cooling_fake_firmware.json b/tests/data/anna/anna_heatpump_cooling_fake_firmware.json
index dd9291df2..63311f02b 100644
--- a/tests/data/anna/anna_heatpump_cooling_fake_firmware.json
+++ b/tests/data/anna/anna_heatpump_cooling_fake_firmware.json
@@ -55,10 +55,7 @@
     },
     "3cb70739631c4d17a86b8b12e8a5161b": {
       "active_preset": "home",
-      "available_schedules": [
-        "standaard",
-        "off"
-      ],
+      "available_schedules": ["standaard", "off"],
       "climate_mode": "heat_cool",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -66,13 +63,7 @@
       "location": "c784ee9fdab44e1395b8dee7d7a497d5",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "home",
-        "away",
-        "asleep",
-        "vacation"
-      ],
+      "preset_modes": ["no_frost", "home", "away", "asleep", "vacation"],
       "select_schedule": "off",
       "sensors": {
         "cooling_activation_outdoor_temperature": 21.0,
diff --git a/tests/data/anna/anna_heatpump_heating.json b/tests/data/anna/anna_heatpump_heating.json
index db65c31cb..0f74a2d6b 100644
--- a/tests/data/anna/anna_heatpump_heating.json
+++ b/tests/data/anna/anna_heatpump_heating.json
@@ -60,10 +60,7 @@
     },
     "3cb70739631c4d17a86b8b12e8a5161b": {
       "active_preset": "home",
-      "available_schedules": [
-        "standaard",
-        "off"
-      ],
+      "available_schedules": ["standaard", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -71,13 +68,7 @@
       "location": "c784ee9fdab44e1395b8dee7d7a497d5",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "home",
-        "away",
-        "asleep",
-        "vacation"
-      ],
+      "preset_modes": ["no_frost", "home", "away", "asleep", "vacation"],
       "select_schedule": "standaard",
       "sensors": {
         "cooling_activation_outdoor_temperature": 21.0,
diff --git a/tests/data/anna/anna_loria_cooling_active.json b/tests/data/anna/anna_loria_cooling_active.json
index eca1cfe6c..982702d2e 100644
--- a/tests/data/anna/anna_loria_cooling_active.json
+++ b/tests/data/anna/anna_loria_cooling_active.json
@@ -2,11 +2,7 @@
   "entities": {
     "582dfbdace4d4aeb832923ce7d1ddda0": {
       "active_preset": "home",
-      "available_schedules": [
-        "Winter",
-        "Test ",
-        "off"
-      ],
+      "available_schedules": ["Winter", "Test ", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -14,13 +10,7 @@
       "location": "15da035090b847e7a21f93e08c015ebc",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "away",
-        "vacation",
-        "no_frost",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["away", "vacation", "no_frost", "home", "asleep"],
       "select_schedule": "Winter",
       "sensors": {
         "illuminance": 45.0,
@@ -70,13 +60,7 @@
         "heating_state": false
       },
       "dev_class": "heater_central",
-      "dhw_modes": [
-        "off",
-        "auto",
-        "boost",
-        "eco",
-        "comfort"
-      ],
+      "dhw_modes": ["off", "auto", "boost", "eco", "comfort"],
       "location": "674b657c138a41a291d315d7471deb06",
       "max_dhw_temperature": {
         "lower_bound": 35.0,
diff --git a/tests/data/anna/anna_loria_driessens.json b/tests/data/anna/anna_loria_driessens.json
index 8b6061c9e..55f3c0458 100644
--- a/tests/data/anna/anna_loria_driessens.json
+++ b/tests/data/anna/anna_loria_driessens.json
@@ -33,13 +33,7 @@
       "location": "fa70e08550c94de3a34feb27ecf31421",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "vacation",
-        "away",
-        "home"
-      ],
+      "preset_modes": ["no_frost", "asleep", "vacation", "away", "home"],
       "select_schedule": "Verwarmen@9-23u",
       "sensors": {
         "illuminance": 5.5,
@@ -72,13 +66,7 @@
         "heating_state": false
       },
       "dev_class": "heater_central",
-      "dhw_modes": [
-        "comfort",
-        "eco",
-        "off",
-        "boost",
-        "auto"
-      ],
+      "dhw_modes": ["comfort", "eco", "off", "boost", "auto"],
       "location": "82c15f65c9bf44c592d69e16139355e3",
       "max_dhw_temperature": {
         "lower_bound": 35.0,
diff --git a/tests/data/anna/anna_loria_heating_idle.json b/tests/data/anna/anna_loria_heating_idle.json
index c4baacc9f..4a271cd8c 100644
--- a/tests/data/anna/anna_loria_heating_idle.json
+++ b/tests/data/anna/anna_loria_heating_idle.json
@@ -2,11 +2,7 @@
   "entities": {
     "582dfbdace4d4aeb832923ce7d1ddda0": {
       "active_preset": "home",
-      "available_schedules": [
-        "Winter",
-        "Test ",
-        "off"
-      ],
+      "available_schedules": ["Winter", "Test ", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -14,13 +10,7 @@
       "location": "15da035090b847e7a21f93e08c015ebc",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "away",
-        "vacation",
-        "no_frost",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["away", "vacation", "no_frost", "home", "asleep"],
       "select_schedule": "Winter",
       "sensors": {
         "illuminance": 45.0,
@@ -70,13 +60,7 @@
         "heating_state": false
       },
       "dev_class": "heater_central",
-      "dhw_modes": [
-        "off",
-        "auto",
-        "boost",
-        "eco",
-        "comfort"
-      ],
+      "dhw_modes": ["off", "auto", "boost", "eco", "comfort"],
       "location": "674b657c138a41a291d315d7471deb06",
       "max_dhw_temperature": {
         "lower_bound": 35.0,
diff --git a/tests/data/anna/anna_v4.json b/tests/data/anna/anna_v4.json
index 581ef2ff0..ea2ef0986 100644
--- a/tests/data/anna/anna_v4.json
+++ b/tests/data/anna/anna_v4.json
@@ -2,11 +2,7 @@
   "device_zones": {
     "01b85360fdd243d0aaad4d6ac2a5ba7e": {
       "active_preset": "home",
-      "available_schedules": [
-        "Standaard",
-        "Thuiswerken",
-        "off"
-      ],
+      "available_schedules": ["Standaard", "Thuiswerken", "off"],
       "climate_mode": "heat",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -14,13 +10,7 @@
       "location": "eb5309212bf5407bb143e5bfa3b18aee",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "vacation",
-        "no_frost",
-        "away",
-        "asleep",
-        "home"
-      ],
+      "preset_modes": ["vacation", "no_frost", "away", "asleep", "home"],
       "select_schedule": "off",
       "sensors": {
         "illuminance": 60.0,
diff --git a/tests/data/anna/anna_v4_dhw.json b/tests/data/anna/anna_v4_dhw.json
index 3cbf7e717..d169bc75e 100644
--- a/tests/data/anna/anna_v4_dhw.json
+++ b/tests/data/anna/anna_v4_dhw.json
@@ -2,11 +2,7 @@
   "entities": {
     "01b85360fdd243d0aaad4d6ac2a5ba7e": {
       "active_preset": "home",
-      "available_schedules": [
-        "Standaard",
-        "Thuiswerken",
-        "off"
-      ],
+      "available_schedules": ["Standaard", "Thuiswerken", "off"],
       "climate_mode": "heat",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -14,13 +10,7 @@
       "location": "eb5309212bf5407bb143e5bfa3b18aee",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "vacation",
-        "no_frost",
-        "away",
-        "asleep",
-        "home"
-      ],
+      "preset_modes": ["vacation", "no_frost", "away", "asleep", "home"],
       "select_schedule": "off",
       "sensors": {
         "illuminance": 60.0,
diff --git a/tests/data/anna/anna_v4_no_tag.json b/tests/data/anna/anna_v4_no_tag.json
index 7ce51a609..37b8c03fa 100644
--- a/tests/data/anna/anna_v4_no_tag.json
+++ b/tests/data/anna/anna_v4_no_tag.json
@@ -2,11 +2,7 @@
   "entities": {
     "01b85360fdd243d0aaad4d6ac2a5ba7e": {
       "active_preset": "home",
-      "available_schedules": [
-        "Standaard",
-        "Thuiswerken",
-        "off"
-      ],
+      "available_schedules": ["Standaard", "Thuiswerken", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -14,13 +10,7 @@
       "location": "eb5309212bf5407bb143e5bfa3b18aee",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "vacation",
-        "no_frost",
-        "away",
-        "asleep",
-        "home"
-      ],
+      "preset_modes": ["vacation", "no_frost", "away", "asleep", "home"],
       "select_schedule": "Thuiswerken",
       "sensors": {
         "illuminance": 60.0,
diff --git a/tests/data/anna/anna_without_boiler_fw441.json b/tests/data/anna/anna_without_boiler_fw441.json
index f5b6b0c77..ed8688810 100644
--- a/tests/data/anna/anna_without_boiler_fw441.json
+++ b/tests/data/anna/anna_without_boiler_fw441.json
@@ -2,11 +2,7 @@
   "entities": {
     "7ffbb3ab4b6c4ab2915d7510f7bf8fe9": {
       "active_preset": "home",
-      "available_schedules": [
-        "Test",
-        "Normaal",
-        "off"
-      ],
+      "available_schedules": ["Test", "Normaal", "off"],
       "climate_mode": "auto",
       "dev_class": "thermostat",
       "firmware": "2018-02-08T11:15:53+01:00",
@@ -14,13 +10,7 @@
       "location": "c34c6864216446528e95d88985e714cc",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "no_frost",
-        "asleep",
-        "away",
-        "vacation",
-        "home"
-      ],
+      "preset_modes": ["no_frost", "asleep", "away", "vacation", "home"],
       "select_schedule": "Normaal",
       "sensors": {
         "illuminance": 0.25,
diff --git a/tests/data/anna/legacy_anna.json b/tests/data/anna/legacy_anna.json
index a6454ec27..c2ebda9d9 100644
--- a/tests/data/anna/legacy_anna.json
+++ b/tests/data/anna/legacy_anna.json
@@ -43,13 +43,7 @@
       "location": "0000aaaa0000aaaa0000aaaa0000aa00",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "away",
-        "vacation",
-        "asleep",
-        "home",
-        "no_frost"
-      ],
+      "preset_modes": ["away", "vacation", "asleep", "home", "no_frost"],
       "sensors": {
         "illuminance": 150.8,
         "setpoint": 20.5,
diff --git a/tests/data/anna/legacy_anna_2.json b/tests/data/anna/legacy_anna_2.json
index d41d7ca94..9028e5719 100644
--- a/tests/data/anna/legacy_anna_2.json
+++ b/tests/data/anna/legacy_anna_2.json
@@ -2,10 +2,7 @@
   "entities": {
     "9e7377867dc24e51b8098a5ba02bd89d": {
       "active_preset": null,
-      "available_schedules": [
-        "Thermostat schedule",
-        "off"
-      ],
+      "available_schedules": ["Thermostat schedule", "off"],
       "climate_mode": "heat",
       "dev_class": "thermostat",
       "firmware": "2017-03-13T11:54:58+01:00",
@@ -13,13 +10,7 @@
       "location": "be81e3f8275b4129852c4d8d550ae2eb",
       "model": "ThermoTouch",
       "name": "Anna",
-      "preset_modes": [
-        "vacation",
-        "away",
-        "no_frost",
-        "home",
-        "asleep"
-      ],
+      "preset_modes": ["vacation", "away", "no_frost", "home", "asleep"],
       "select_schedule": "off",
       "sensors": {
         "illuminance": 19.5,
diff --git a/tests/data/stretch/stretch_v23.json b/tests/data/stretch/stretch_v23.json
index 79038dbb0..15fb4d4df 100644
--- a/tests/data/stretch/stretch_v23.json
+++ b/tests/data/stretch/stretch_v23.json
@@ -305,9 +305,7 @@
     },
     "f7b145c8492f4dd7a4de760456fdef3e": {
       "dev_class": "switching",
-      "members": [
-        "407aa1c1099d463c9137a3a9eda787fd"
-      ],
+      "members": ["407aa1c1099d463c9137a3a9eda787fd"],
       "model": "Switchgroup",
       "name": "Test",
       "switches": {
diff --git a/tests/test_adam.py b/tests/test_adam.py
index 3d3cfa0f8..94a9075c0 100644
--- a/tests/test_adam.py
+++ b/tests/test_adam.py
@@ -76,9 +76,9 @@ async def test_connect_adam_plus_anna_new(self):
         )
         assert result
 
-        smile._schedule_old_states["f2bf9048bef64cc5b6d5110154e33c81"][
-            "Badkamer"
-        ] = "off"
+        smile._schedule_old_states["f2bf9048bef64cc5b6d5110154e33c81"]["Badkamer"] = (
+            "off"
+        )
         result_1 = await self.tinker_thermostat_schedule(
             smile,
             "f2bf9048bef64cc5b6d5110154e33c81",
@@ -153,7 +153,9 @@ async def test_connect_adam_plus_anna_new(self):
         self.smile_setup = "adam_plus_anna_new"
         testdata = self.load_testdata(SMILE_TYPE, self.smile_setup)
         server, smile, client = await self.connect_wrapper(raise_timeout=True)
-        await self.device_test(smile, "2023-12-17 00:00:01", testdata, skip_testing=True)
+        await self.device_test(
+            smile, "2023-12-17 00:00:01", testdata, skip_testing=True
+        )
 
         tinkered = await self.tinker_max_boiler_temp(smile, unhappy=True)
         assert tinkered
@@ -228,7 +230,9 @@ async def test_connect_adam_zone_per_device(self):
         await self.disconnect(server, client)
 
         server, smile, client = await self.connect_wrapper(raise_timeout=True)
-        await self.device_test(smile, "2022-05-16 00:00:01", testdata, skip_testing=True)
+        await self.device_test(
+            smile, "2022-05-16 00:00:01", testdata, skip_testing=True
+        )
         result = await self.tinker_thermostat(
             smile,
             "c50f167537524366a5af7aa3942feb1e",
@@ -382,7 +386,9 @@ async def test_connect_adam_plus_anna(self):
         await self.disconnect(server, client)
 
         server, smile, client = await self.connect_wrapper(raise_timeout=True)
-        await self.device_test(smile, "2020-03-22 00:00:01", testdata, skip_testing=True)
+        await self.device_test(
+            smile, "2020-03-22 00:00:01", testdata, skip_testing=True
+        )
         result = await self.tinker_thermostat(
             smile,
             "009490cc2f674ce6b576863fbb64f867",
diff --git a/tests/test_anna.py b/tests/test_anna.py
index 177eaa007..a5e81702b 100644
--- a/tests/test_anna.py
+++ b/tests/test_anna.py
@@ -70,7 +70,9 @@ async def test_connect_anna_v4(self):
         server, smile, client = await self.connect_wrapper(raise_timeout=True)
         # Reset self.smile_setup
         self.smile_setup = "anna_v4"
-        await self.device_test(smile, "2020-04-05 00:00:01", testdata, skip_testing=True)
+        await self.device_test(
+            smile, "2020-04-05 00:00:01", testdata, skip_testing=True
+        )
         result = await self.tinker_thermostat(
             smile,
             "eb5309212bf5407bb143e5bfa3b18aee",
@@ -81,7 +83,9 @@ async def test_connect_anna_v4(self):
         assert result
 
         result = await self.tinker_temp_offset(
-            smile, "01b85360fdd243d0aaad4d6ac2a5ba7e", unhappy=True,
+            smile,
+            "01b85360fdd243d0aaad4d6ac2a5ba7e",
+            unhappy=True,
         )
         assert result
 
@@ -497,7 +501,9 @@ async def test_connect_anna_loria_heating_idle(self):
         await self.disconnect(server, client)
 
         server, smile, client = await self.connect_wrapper(raise_timeout=True)
-        await self.device_test(smile, "2022-05-16 00:00:01", testdata, skip_testing=True)
+        await self.device_test(
+            smile, "2022-05-16 00:00:01", testdata, skip_testing=True
+        )
 
         tinkered = await self.tinker_dhw_mode(smile, unhappy=True)
         assert tinkered
@@ -505,7 +511,6 @@ async def test_connect_anna_loria_heating_idle(self):
         await smile.close_connection()
         await self.disconnect(server, client)
 
-
     @pytest.mark.asyncio
     async def test_connect_anna_loria_cooling_active(self):
         """Test an Anna with a Loria in heating mode - state idle."""
diff --git a/tests/test_generic.py b/tests/test_generic.py
index f5b861b68..e098095f6 100644
--- a/tests/test_generic.py
+++ b/tests/test_generic.py
@@ -9,9 +9,7 @@
 from .test_init import _LOGGER, TestPlugwise, pw_exceptions
 
 
-class TestPlugwiseGeneric(
-    TestPlugwise
-):  # pylint: disable=attribute-defined-outside-init
+class TestPlugwiseGeneric(TestPlugwise):  # pylint: disable=attribute-defined-outside-init
     """Tests for generic functionality."""
 
     @pytest.mark.asyncio
diff --git a/tests/test_init.py b/tests/test_init.py
index e7bf771b9..b35a35138 100644
--- a/tests/test_init.py
+++ b/tests/test_init.py
@@ -1,5 +1,6 @@
 # pylint: disable=protected-access
 """Test Plugwise Home Assistant module and generate test JSON fixtures."""
+
 import importlib
 import json
 
@@ -51,6 +52,10 @@ class TestPlugwise:  # pylint: disable=attribute-defined-outside-init
 
     def _write_json(self, call, data):
         """Store JSON data to per-setup files for HA component testing."""
+        no_fixtures = os.getenv("NO_FIXTURES") == "1"
+        if no_fixtures:
+            return  # pragma: no cover
+
         path = os.path.join(
             os.path.dirname(__file__), "../fixtures/" + self.smile_setup
         )
@@ -109,27 +114,19 @@ async def setup_app(
         # Introducte timeout with 2 seconds, test by setting response to 10ms
         # Don't actually wait 2 seconds as this will prolongue testing
         if not raise_timeout:
-            app.router.add_route(
-                "POST", CORE_GATEWAYS_TAIL, self.smile_http_accept
-            )
+            app.router.add_route("POST", CORE_GATEWAYS_TAIL, self.smile_http_accept)
             app.router.add_route("PUT", CORE_LOCATIONS_TAIL, self.smile_http_accept)
             app.router.add_route(
                 "DELETE", CORE_NOTIFICATIONS_TAIL, self.smile_http_accept
             )
             app.router.add_route("PUT", CORE_RULES_TAIL, self.smile_http_accept)
-            app.router.add_route(
-                "PUT", CORE_APPLIANCES_TAIL, self.smile_http_accept
-            )
+            app.router.add_route("PUT", CORE_APPLIANCES_TAIL, self.smile_http_accept)
         else:
-            app.router.add_route(
-                "POST", CORE_GATEWAYS_TAIL, self.smile_timeout
-            )
+            app.router.add_route("POST", CORE_GATEWAYS_TAIL, self.smile_timeout)
             app.router.add_route("PUT", CORE_LOCATIONS_TAIL, self.smile_timeout)
             app.router.add_route("PUT", CORE_RULES_TAIL, self.smile_timeout)
             app.router.add_route("PUT", CORE_APPLIANCES_TAIL, self.smile_timeout)
-            app.router.add_route(
-                "DELETE", CORE_NOTIFICATIONS_TAIL, self.smile_timeout
-            )
+            app.router.add_route("DELETE", CORE_NOTIFICATIONS_TAIL, self.smile_timeout)
 
         return app
 
@@ -373,7 +370,9 @@ async def connect_legacy(
         )
 
         # Happy flow
-        app = await self.setup_legacy_app(broken, timeout, raise_timeout, fail_auth, stretch)
+        app = await self.setup_legacy_app(
+            broken, timeout, raise_timeout, fail_auth, stretch
+        )
 
         server = aiohttp.test_utils.TestServer(
             app, port=port, scheme="http", host="127.0.0.1"
@@ -631,9 +630,13 @@ def test_and_assert(test_dict, data, header):
             heat_cooler = data.devices[data.gateway["heater_id"]]
             if "binary_sensors" in heat_cooler:
                 if "cooling_enabled" in heat_cooler["binary_sensors"]:
-                    self._cooling_enabled = heat_cooler["binary_sensors"]["cooling_enabled"]
+                    self._cooling_enabled = heat_cooler["binary_sensors"][
+                        "cooling_enabled"
+                    ]
                 if "cooling_state" in heat_cooler["binary_sensors"]:
-                    self._cooling_active = heat_cooler["binary_sensors"]["cooling_state"]
+                    self._cooling_active = heat_cooler["binary_sensors"][
+                        "cooling_state"
+                    ]
 
         self._write_json("all_data", {"devices": data.devices, "gateway": data.gateway})
 
@@ -692,10 +695,12 @@ async def tinker_switch(
             except pw_exceptions.PlugwiseError:
                 _LOGGER.info("  + locked, not switched as expected")
                 return False
-            except pw_exceptions.ConnectionFailedError:  # leave for-loop at connect-error
+            except (
+                pw_exceptions.ConnectionFailedError
+            ):  # leave for-loop at connect-error
                 if unhappy:
-                    return True  # test is pass!
                     _LOGGER.info("  + failed as expected")
+                    return True  # test is pass!
                 else:  # pragma: no cover
                     _LOGGER.info("  - failed unexpectedly")
                     return False
@@ -750,7 +755,9 @@ async def tinker_thermostat_preset(self, smile, loc_id, unhappy=False):
             except pw_exceptions.PlugwiseError:
                 _LOGGER.info("  + found invalid preset, as expected")
                 tinker_preset_passed = True
-            except pw_exceptions.ConnectionFailedError:  # leave for-loop at connect-error
+            except (
+                pw_exceptions.ConnectionFailedError
+            ):  # leave for-loop at connect-error
                 if unhappy:
                     _LOGGER.info("  + tinker_thermostat_preset failed as expected")
                     return True
@@ -778,13 +785,17 @@ async def tinker_thermostat_schedule(
                     new_schedule = new_schedule[1:]
                 _LOGGER.info("- Adjusting schedule to %s", f"{new_schedule}{warning}")
                 try:
-                    await smile.set_select("select_schedule", loc_id, new_schedule, state)
+                    await smile.set_select(
+                        "select_schedule", loc_id, new_schedule, state
+                    )
                     tinker_schedule_passed = True
                     _LOGGER.info("  + working as intended")
                 except pw_exceptions.PlugwiseError:
                     _LOGGER.info("  + failed as expected")
                     tinker_schedule_passed = True
-                except pw_exceptions.ConnectionFailedError:  # leave for-loop at connect-error
+                except (
+                    pw_exceptions.ConnectionFailedError
+                ):  # leave for-loop at connect-error
                     tinker_schedule_passed = False
                     if unhappy:
                         _LOGGER.info("  + failed as expected before intended failure")
@@ -812,7 +823,9 @@ async def tinker_legacy_thermostat_schedule(self, smile, unhappy=False):
             except pw_exceptions.PlugwiseError:
                 _LOGGER.info("  + failed as expected")
                 tinker_schedule_passed = True
-            except pw_exceptions.ConnectionFailedError:  # leave for-loop at connect-error
+            except (
+                pw_exceptions.ConnectionFailedError
+            ):  # leave for-loop at connect-error
                 tinker_schedule_passed = False
                 if unhappy:
                     _LOGGER.info("  + failed as expected before intended failure")
@@ -896,7 +909,9 @@ async def tinker_dhw_mode(smile, unhappy=False):
             except pw_exceptions.PlugwiseError:
                 _LOGGER.info("  + tinker_dhw_mode found invalid mode, as expected")
                 tinker_dhw_mode_passed = False
-            except pw_exceptions.ConnectionFailedError:  # leave for-loop at connect-error
+            except (
+                pw_exceptions.ConnectionFailedError
+            ):  # leave for-loop at connect-error
                 if unhappy:
                     _LOGGER.info("  + failed as expected before intended failure")
                     return True
@@ -925,7 +940,9 @@ async def tinker_regulation_mode(smile, unhappy=False):
                     "  + tinker_regulation_mode found invalid mode, as expected"
                 )
                 tinker_reg_mode_passed = False
-            except pw_exceptions.ConnectionFailedError:  # leave for-loop at connect-error
+            except (
+                pw_exceptions.ConnectionFailedError
+            ):  # leave for-loop at connect-error
                 if unhappy:
                     _LOGGER.info("  + failed as expected before intended failure")
                     return True
@@ -941,7 +958,11 @@ async def tinker_max_boiler_temp(smile, unhappy=False):
         tinker_max_boiler_temp_passed = False
         new_temp = 60.0
         _LOGGER.info("- Adjusting temperature to %s", new_temp)
-        for test in ["maximum_boiler_temperature", "max_dhw_temperature", "bogus_temperature"]:
+        for test in [
+            "maximum_boiler_temperature",
+            "max_dhw_temperature",
+            "bogus_temperature",
+        ]:
             _LOGGER.info("  + for %s", test)
             try:
                 await smile.set_number("dummy", test, new_temp)
@@ -950,7 +971,9 @@ async def tinker_max_boiler_temp(smile, unhappy=False):
             except pw_exceptions.PlugwiseError:
                 _LOGGER.info("  + tinker_max_boiler_temp failed as intended")
                 tinker_max_boiler_temp_passed = False
-            except pw_exceptions.ConnectionFailedError:  # leave for-loop at connect-error
+            except (
+                pw_exceptions.ConnectionFailedError
+            ):  # leave for-loop at connect-error
                 if unhappy:
                     _LOGGER.info("  + failed as expected before intended failure")
                     return True
@@ -997,7 +1020,9 @@ async def tinker_gateway_mode(smile, unhappy=False):
             except pw_exceptions.PlugwiseError:
                 _LOGGER.info("  + found invalid mode, as expected")
                 tinker_gateway_mode_passed = False
-            except pw_exceptions.ConnectionFailedError:  # leave for-loop at connect-error
+            except (
+                pw_exceptions.ConnectionFailedError
+            ):  # leave for-loop at connect-error
                 if unhappy:
                     _LOGGER.info("  + failed as expected before intended failure")
                     return True
diff --git a/tests/test_legacy_anna.py b/tests/test_legacy_anna.py
index 32b1a26da..6f05eccd5 100644
--- a/tests/test_legacy_anna.py
+++ b/tests/test_legacy_anna.py
@@ -39,7 +39,9 @@ async def test_connect_legacy_anna(self):
         await self.disconnect(server, client)
 
         server, smile, client = await self.connect_legacy_wrapper(raise_timeout=True)
-        await self.device_test(smile, "2020-03-22 00:00:01", testdata, skip_testing=True)
+        await self.device_test(
+            smile, "2020-03-22 00:00:01", testdata, skip_testing=True
+        )
         result = await self.tinker_legacy_thermostat(smile, unhappy=True)
         assert result
         await smile.close_connection()
diff --git a/tests/test_legacy_generic.py b/tests/test_legacy_generic.py
index 825d18959..f5a433b72 100644
--- a/tests/test_legacy_generic.py
+++ b/tests/test_legacy_generic.py
@@ -5,9 +5,7 @@
 from .test_init import TestPlugwise, pw_exceptions
 
 
-class TestPlugwiseGeneric(
-    TestPlugwise
-):  # pylint: disable=attribute-defined-outside-init
+class TestPlugwiseGeneric(TestPlugwise):  # pylint: disable=attribute-defined-outside-init
     """Tests for generic functionality."""
 
     @pytest.mark.asyncio
diff --git a/tests/test_legacy_stretch.py b/tests/test_legacy_stretch.py
index 961bb6378..f5056dee6 100644
--- a/tests/test_legacy_stretch.py
+++ b/tests/test_legacy_stretch.py
@@ -7,9 +7,7 @@
 SMILE_TYPE = "stretch"
 
 
-class TestPlugwiseStretch(
-    TestPlugwise
-):  # pylint: disable=attribute-defined-outside-init
+class TestPlugwiseStretch(TestPlugwise):  # pylint: disable=attribute-defined-outside-init
     """Tests for Stretch."""
 
     @pytest.mark.asyncio
@@ -34,7 +32,8 @@ async def test_connect_stretch_v31(self):
         assert self.entity_items == 83
 
         switch_change = await self.tinker_switch(
-            smile, "059e4d03c7a34d278add5c7a4a781d19",
+            smile,
+            "059e4d03c7a34d278add5c7a4a781d19",
         )
         assert not switch_change