diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0da2a6c..faca0eb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: - name: Install dependencies run: | # Replace path dependencies with PyPI versions for CI - sed -i 's/span-panel-api = {path = "..\/span-panel-api", develop = true}/span-panel-api = "^1.1.13"/' pyproject.toml + sed -i 's/span-panel-api = {path = "..\/span-panel-api", develop = true}/span-panel-api = "^1.1.14"/' pyproject.toml sed -i 's/ha-synthetic-sensors = {path = "..\/ha-synthetic-sensors", develop = true}/ha-synthetic-sensors = "^1.1.13"/' pyproject.toml # Regenerate lock file with the modified dependencies poetry lock diff --git a/CHANGELOG.md b/CHANGELOG.md index 11a401d..0a584a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,20 +5,27 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.30] - 2025-12-31 + +### 🔄 Changed + +- **Bump span-panel-api to v1.1.14**: Recognize panel Keep-Alive at 5 sec, Handle httpx.RemoteProtocolError defensively, Thanks to + @NickBorgersOnLowSecurityNode. + ## [1.29] - 2025-12-25 ### ✨ New Features - **Energy Spike Cleanup Service**: New `span_panel.cleanup_energy_spikes` service to detect and remove negative energy spikes from Home Assistant statistics caused by panel firmware updates. Includes dry-run mode for safe preview before deletion. -- **Firmware Reset Detection (Beta)**: Monitoring of main meter energy sensor to detect errant (negative energy reports over time). Sends a persistent notification - when detected, guiding users to adjust statistics if desired. +- **Firmware Reset Detection (Beta)**: Monitoring of main meter energy sensor to detect errant (negative energy reports over time). Sends a persistent + notification when detected, guiding users to adjust statistics if desired. ### 🔄 Changed - **Removed Decreasing Energy Protection**: Reverted the TOTAL_INCREASING validation that was ignoring decreasing energy values that were thought to occur a - limited number of updates but turned out to be permanent under-reporting of SPAN cloud data that manifested during firmware updates. The bug is on the SPAN - side and can result in spikes in energy dashbaoards after firmware updates. See the Trouble-Shooting section of the README.md for more information. + limited number of updates but turned out to be permanent under-reporting of SPAN cloud data that manifested during firmware updates. The bug is on the SPAN + side and can result in spikes in energy dashbaoards after firmware updates. See the Trouble-Shooting section of the README.md for more information. ### 📝 Notes diff --git a/README.md b/README.md index c87bf8d..3761503 100644 --- a/README.md +++ b/README.md @@ -16,27 +16,18 @@ monitoring and control of your home's electrical system. This integration relies on the OpenAPI interface contract sourced from the SPAN Panel. The integration may break if SPAN changes the API in an incompatible way. -We cannot provide technical support for either SPAN or your home's electrical system. The software is provided as-is with no warranty or guarantee of -performance or suitability to your particular setting. +The software is provided as-is with no warranty or guarantee of performance or suitability to your particular setting. This integration provides the user with sensors and controls that are useful in understanding an installation's power consumption, energy usage, and the ability to control user-manageable panel circuits. -## What's New +## Major Upgrade -### Major Upgrade +**Before upgrading to version 1.2.x from a prior version, please backup your Home Assistant configuration and database.** -**Before upgrading to version 1.2.x, please backup your Home Assistant configuration and database.** This version introduces significant architectural changes. -While we've implemented migration logic to preserve your existing entities and automations, it's always recommended to have a backup before major upgrades. +See the [CHANGELOG.md](CHANGELOG.md) for detailed information about all new features and improvements. -**OpenAPI Support**: The integration now uses the OpenAPI specification provided by the SPAN panel. This change provides a reliable foundation for future -interface changes but some users have reported that newer panels might have closed off the interface (see trouble shooting). If and when SPAN provides -additional support we may adapt. - -**New Features**: This version introduces net energy calculations, simulation support, configurable timeouts, SSL support, circuit name sync, and flexible -entity naming patterns. See the [CHANGELOG.md](CHANGELOG.md) for detailed information about all new features and improvements. - -### HACS Upgrade Process +## HACS Upgrade Process When upgrading through HACS, you'll see a notification about the new version. Before clicking "Update": @@ -51,7 +42,7 @@ If you encounter any issues during the upgrade, you can: - Check the [troubleshooting section](#troubleshooting) below - Open an issue on GitHub with details about your installation -## Prerequisites +### Prerequisites - [Home Assistant](https://www.home-assistant.io/) installed - [HACS](https://hacs.xyz/) installed @@ -324,6 +315,7 @@ Additional contributors: - pavandave - sargonas +- NickBorgersOnLowSecurityNode ## Issues diff --git a/custom_components/span_panel/manifest.json b/custom_components/span_panel/manifest.json index 9ce6aaa..b62a70f 100644 --- a/custom_components/span_panel/manifest.json +++ b/custom_components/span_panel/manifest.json @@ -12,9 +12,9 @@ "iot_class": "local_polling", "issue_tracker": "https://github.com/SpanPanel/span/issues", "requirements": [ - "span-panel-api~=1.1.13" + "span-panel-api~=1.1.14" ], - "version": "1.2.9", + "version": "1.3.0", "zeroconf": [ { "type": "_span._tcp.local." diff --git a/poetry.lock b/poetry.lock index 0ace816..9a926e5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -25,18 +25,18 @@ test = ["pytest", "pytest-xdist", "typing-extensions"] [[package]] name = "aiodns" -version = "3.5.0" +version = "3.6.1" description = "Simple DNS resolver for asyncio" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "aiodns-3.5.0-py3-none-any.whl", hash = "sha256:6d0404f7d5215849233f6ee44854f2bb2481adf71b336b2279016ea5990ca5c5"}, - {file = "aiodns-3.5.0.tar.gz", hash = "sha256:11264edbab51896ecf546c18eb0dd56dff0428c6aa6d2cd87e643e07300eb310"}, + {file = "aiodns-3.6.1-py3-none-any.whl", hash = "sha256:46233ccad25f2037903828c5d05b64590eaa756e51d12b4a5616e2defcbc98c7"}, + {file = "aiodns-3.6.1.tar.gz", hash = "sha256:b0e9ce98718a5b8f7ca8cd16fc393163374bc2412236b91f6c851d066e3324b6"}, ] [package.dependencies] -pycares = ">=4.9.0" +pycares = ">=4.9.0,<5" [[package]] name = "aiohappyeyeballs" @@ -2144,18 +2144,18 @@ habluetooth = ">=3.0" [[package]] name = "homeassistant" -version = "2025.12.2" +version = "2025.12.4" description = "Open-source home automation platform running on Python 3." optional = false python-versions = ">=3.13.2" groups = ["main", "dev"] files = [ - {file = "homeassistant-2025.12.2-py3-none-any.whl", hash = "sha256:d9a88cb429407d6975b7e3c16a3810f4b734fc76b18c50527973417f1010c2d3"}, - {file = "homeassistant-2025.12.2.tar.gz", hash = "sha256:8258a9a34797e4d1cad12d24b51b58ea0d5850c537d67241d58948c488adcf26"}, + {file = "homeassistant-2025.12.4-py3-none-any.whl", hash = "sha256:b42f629c10a5d28062ef9527810139677b41daee7e6b1c1af20c0bb185e529c4"}, + {file = "homeassistant-2025.12.4.tar.gz", hash = "sha256:c157b9fecca3f3bf01de8ed05a0436c0e12c6ddcaf1560ff54c829a24d52c0e4"}, ] [package.dependencies] -aiodns = "3.5.0" +aiodns = "3.6.1" aiohasupervisor = "0.3.3" aiohttp = "3.13.2" aiohttp-asyncmdnsresolver = "0.1.1" @@ -2208,18 +2208,18 @@ zeroconf = "0.148.0" [[package]] name = "homeassistant-stubs" -version = "2025.12.2" +version = "2025.12.4" description = "PEP 484 typing stubs for Home Assistant Core" optional = false python-versions = ">=3.13.2" groups = ["dev"] files = [ - {file = "homeassistant_stubs-2025.12.2-py3-none-any.whl", hash = "sha256:e4dfc118c415eedd086c37949c359d067fa12d83f9f8a9184b26a6869ed20cd8"}, - {file = "homeassistant_stubs-2025.12.2.tar.gz", hash = "sha256:c13e6d58bedebced21162fc86fcda8a9e13ea7b0ad79fa0c01b3ba2f2a203365"}, + {file = "homeassistant_stubs-2025.12.4-py3-none-any.whl", hash = "sha256:d7402ae229320d0fb89375962504e91ffbf4f07f7c8b12b1fa0d27c3121517df"}, + {file = "homeassistant_stubs-2025.12.4.tar.gz", hash = "sha256:be5f301b622ee03d19cc65163f4481bbe312826d19027417f80b8e1991a00aba"}, ] [package.dependencies] -homeassistant = "2025.12.2" +homeassistant = "2025.12.4" [[package]] name = "httpcore" @@ -4365,21 +4365,21 @@ pytest = ">=6.0.0" [[package]] name = "pytest-homeassistant-custom-component" -version = "0.13.300" +version = "0.13.301" description = "Experimental package to automatically extract test plugins for Home Assistant custom components" optional = false python-versions = ">=3.13" groups = ["dev"] files = [ - {file = "pytest_homeassistant_custom_component-0.13.300-py3-none-any.whl", hash = "sha256:1c5725712e093319a91977757a6e66372b13e208178138dfed64080278e79933"}, - {file = "pytest_homeassistant_custom_component-0.13.300.tar.gz", hash = "sha256:62645397c8ef132716ac4ecf65411a93b318be2ba717255dd6fc820bd1860f6a"}, + {file = "pytest_homeassistant_custom_component-0.13.301-py3-none-any.whl", hash = "sha256:2b6262d4ca76862ac47df3673631de80af29232514022862b2bf072da2faf264"}, + {file = "pytest_homeassistant_custom_component-0.13.301.tar.gz", hash = "sha256:503f347fc91f50155d520e3e90ff08f0a49c5936683453192682f64cfe50bdaa"}, ] [package.dependencies] coverage = "7.10.6" freezegun = "1.5.2" go2rtc-client = "0.3.0" -homeassistant = "2025.12.2" +homeassistant = "2025.12.4" license-expression = "30.4.3" mock-open = "1.4.0" numpy = "2.3.2" @@ -5137,7 +5137,7 @@ test = ["covdefaults (==2.3.0)", "pytest (==8.4.1)", "pytest-aiohttp (==1.1.0)", [[package]] name = "span-panel-api" -version = "1.1.13" +version = "1.1.14" description = "A client library for SPAN Panel API" optional = false python-versions = ">=3.10,<4.0" @@ -5148,7 +5148,7 @@ develop = true [package.dependencies] attrs = ">=22.2.0" click = ">=8.0.0" -httpx = ">=0.20.0,<0.29.0" +httpx = ">=0.28.1,<0.29.0" numpy = ">=1.21.0" python-dateutil = ">=2.8.0" pyyaml = ">=6.0.0" @@ -6315,4 +6315,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.13.2,<3.14" -content-hash = "4346b7e980d64519009c34779ea288c361a2749751afc056c7c82974cac36457" +content-hash = "d2f773c82e16ff28e156c9f3cf068ed68b2d776c27a9c86f2210159f3bfecc2f" diff --git a/pyproject.toml b/pyproject.toml index d4eb4ce..1b7b426 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,12 +10,12 @@ package-mode = false [tool.poetry.dependencies] python = ">=3.13.2,<3.14" -homeassistant = "2025.12.2,<2026.0.0" # Pin to exact version for custom component compatibility +homeassistant = "2025.12.4,<2026.0.0" # Pin to exact version for custom component compatibility span-panel-api = {path = "../span-panel-api", develop = true} [tool.poetry.group.dev.dependencies] # Type stubs and dev-only tools that don't conflict with HA runtime -homeassistant-stubs = "2025.12.2" +homeassistant-stubs = "2025.12.4" types-requests = "*" types-PyYAML = "*" mypy = "*"