From d9a8561e41ce236b927627873331010f71795cca Mon Sep 17 00:00:00 2001 From: Edward Brown Date: Sat, 9 May 2026 16:04:33 +0100 Subject: [PATCH 01/12] Release version 0.3.8-alpha000 --- pyproject.toml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b1adaf8..753a64e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=82", "wheel"] build-backend = "setuptools.build_meta" [tool.corio.metadata] -version = "0.3.7" +version = "0.3.8-alpha000" port = 6 base = "python" description = "Home Assistant Control Objects" @@ -30,14 +30,20 @@ haco = ["pyproject.package.toml"] path = "../corio" editable = true +[tool.tox] +requires = ["tox>=4.22", "tox-uv>=1"] +env_list = [] + +[tool.tox.env] + [project] name = "haco" -version = "0.3.7" +version = "0.3.8-alpha000" description = "Home Assistant Control Objects" readme = "README.md" license = "Apache-2.0" keywords = ["homeassistant", "controls", "python", "tasmota"] -dependencies = ["corio[api,caching,debug,logging,mqtt,sets,version.dev,yaml]==2.2.2", "psutil"] +dependencies = ["corio[api,caching,debug,logging,mqtt,sets,version.dev,yaml]~=2.3.0", "psutil"] [[project.authors]] name = "Frontmatter AI" From 09f451348b8a702eb2f635c6b8260df1138e8ac4 Mon Sep 17 00:00:00 2001 From: Edward Brown Date: Sat, 9 May 2026 16:05:17 +0100 Subject: [PATCH 02/12] Release version 0.3.8 --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 753a64e..dc58141 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=82", "wheel"] build-backend = "setuptools.build_meta" [tool.corio.metadata] -version = "0.3.8-alpha000" +version = "0.3.8" port = 6 base = "python" description = "Home Assistant Control Objects" @@ -38,7 +38,7 @@ env_list = [] [project] name = "haco" -version = "0.3.8-alpha000" +version = "0.3.8" description = "Home Assistant Control Objects" readme = "README.md" license = "Apache-2.0" From 26a93e9a89f881f85166d4dbfc6450e8d60063c1 Mon Sep 17 00:00:00 2001 From: Edward Brown Date: Sat, 9 May 2026 16:43:53 +0100 Subject: [PATCH 03/12] Update test dep --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index dc58141..866151c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,7 +50,7 @@ name = "Frontmatter AI" email = "innovative.fowler@mask.pro.fmtr.dev" [project.optional-dependencies] -test = ["pytest>=8.0", "pytest-cov>=5.0"] +test = ["corio[test]"] [project.urls] Homepage = "https://github.com/fmtr/haco" From b4b7c44a64b282ab3a849d229759fc7d84bb651b Mon Sep 17 00:00:00 2001 From: Edward Brown Date: Sun, 17 May 2026 13:38:57 +0100 Subject: [PATCH 04/12] Fix device announce data not being including in control announce --- haco/control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/haco/control.py b/haco/control.py index 009cd02..114d62e 100644 --- a/haco/control.py +++ b/haco/control.py @@ -30,7 +30,7 @@ class Control(Base, Generic[DeviceT]): name: str icon: str | None = None - device: DeviceT | None = Field(default=None, exclude=True, repr=False) + device: DeviceT | None = Field(default=None, repr=False) capabilities: list = Field(default_factory=list, exclude=True, repr=False) unique_id: str | None = None availability_topic: str | None = None From 57a5f5c3299ba643eb14efc77aa76648a61217ca Mon Sep 17 00:00:00 2001 From: Edward Brown Date: Sun, 17 May 2026 13:39:47 +0100 Subject: [PATCH 05/12] Release version 0.3.9 --- pyproject.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 866151c..0702c72 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=82", "wheel"] build-backend = "setuptools.build_meta" [tool.corio.metadata] -version = "0.3.8" +version = "0.3.9" port = 6 base = "python" description = "Home Assistant Control Objects" @@ -38,19 +38,19 @@ env_list = [] [project] name = "haco" -version = "0.3.8" +version = "0.3.9" description = "Home Assistant Control Objects" readme = "README.md" license = "Apache-2.0" keywords = ["homeassistant", "controls", "python", "tasmota"] -dependencies = ["corio[api,caching,debug,logging,mqtt,sets,version.dev,yaml]~=2.3.0", "psutil"] +dependencies = ["corio[api,caching,debug,logging,mqtt,sets,version.dev,yaml]~=2.3.6", "psutil"] [[project.authors]] name = "Frontmatter AI" email = "innovative.fowler@mask.pro.fmtr.dev" [project.optional-dependencies] -test = ["corio[test]"] +test = ["corio[test]~=2.3.6"] [project.urls] Homepage = "https://github.com/fmtr/haco" From aacb79ab61ed2f672a772970073b6ca778789ed4 Mon Sep 17 00:00:00 2001 From: Edward Brown Date: Sun, 17 May 2026 13:42:50 +0100 Subject: [PATCH 06/12] Add unit test to ensure device announce data included in control announce --- haco/tests/test_pydantic_models.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/haco/tests/test_pydantic_models.py b/haco/tests/test_pydantic_models.py index 1c33d4e..7893131 100644 --- a/haco/tests/test_pydantic_models.py +++ b/haco/tests/test_pydantic_models.py @@ -31,6 +31,10 @@ def test_switch_announce_payload_matches_expected(client_stub): "icon": "mdi:power", "unique_id": "dev-main", "availability_topic": "root/status", + "device": { + "name": "Dev", + "identifiers": ["dev"], + }, "state_topic": "root/client/dev/main/default/state", "command_topic": "root/client/dev/main/default/command", } @@ -59,10 +63,34 @@ def test_climate_announce_payload_has_expected_ha_keys(client_stub): "power_state_topic", } assert expected_subset.issubset(set(data)) - assert not any(key in data for key in {"capabilities", "subscriptions", "device", "parent"}) + assert not any(key in data for key in {"capabilities", "subscriptions", "parent"}) assert not any(callable(value) for value in data.values()) +def test_control_announce_includes_device_announce_data(client_stub): + switch = Switch(name="Main") + device = Device( + name="Dev", + manufacturer="ACME", + model="Model X", + sw_version="1.2.3", + controls=[switch], + ) + device.set_parent(client_stub) + + data = switch.get_announce() + assert data["device"] == { + "name": "Dev", + "manufacturer": "ACME", + "model": "Model X", + "sw_version": "1.2.3", + "identifiers": ["dev"], + } + assert "controls" not in data["device"] + assert "parent" not in data["device"] + assert "subscriptions" not in data["device"] + + def test_model_dump_excludes_runtime_extra_attributes(): switch = Switch(name="Main") switch.dynamic_callback = lambda value: value From 953d31db553d8a657cb14c728872f6c1f27307bf Mon Sep 17 00:00:00 2001 From: Edward Brown Date: Mon, 18 May 2026 11:57:19 +0100 Subject: [PATCH 07/12] Fix README typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d77f9f3..e7c780a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # `haco` Home Assistant Control Objects -`haco` is a to greatly simplify the process of exposing Home Assistant controls (e.g. Pull-down Lists, Number Sliders, Sensors, etc.) from a device - and handling the communication between both sides. +`haco` greatly simplifies the process of exposing Home Assistant controls (e.g. Pull-down Lists, Number Sliders, Sensors, etc.) from a device - and handling the communication between both sides. While the current implementation is in Python, the capability definitions for controls are designed to be shared across different languages. Support for additional languages (namely native support for Tasmota Berry) is planned. From 1dc5b3711c128b080657fb14791828d17efa678e Mon Sep 17 00:00:00 2001 From: Edward Brown Date: Sat, 15 Aug 2026 12:35:10 +0100 Subject: [PATCH 08/12] Release version 0.3.10-alpha000 --- pyproject.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0702c72..560ffab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=82", "wheel"] build-backend = "setuptools.build_meta" [tool.corio.metadata] -version = "0.3.9" +version = "0.3.10-alpha000" port = 6 base = "python" description = "Home Assistant Control Objects" @@ -38,19 +38,19 @@ env_list = [] [project] name = "haco" -version = "0.3.9" +version = "0.3.10-alpha000" description = "Home Assistant Control Objects" readme = "README.md" license = "Apache-2.0" keywords = ["homeassistant", "controls", "python", "tasmota"] -dependencies = ["corio[api,caching,debug,logging,mqtt,sets,version.dev,yaml]~=2.3.6", "psutil"] +dependencies = ["corio[api,caching,debug,logging,mqtt,sets,version.dev,yaml]~=2.7.3", "psutil"] [[project.authors]] name = "Frontmatter AI" email = "innovative.fowler@mask.pro.fmtr.dev" [project.optional-dependencies] -test = ["corio[test]~=2.3.6"] +test = ["corio[test]~=2.7.3"] [project.urls] Homepage = "https://github.com/fmtr/haco" From 5fc71ce126e994006b4d680947442deb8c33b591 Mon Sep 17 00:00:00 2001 From: Edward Brown Date: Sat, 15 Aug 2026 12:37:36 +0100 Subject: [PATCH 09/12] Release version 0.4.0 --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 560ffab..5e67c3c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=82", "wheel"] build-backend = "setuptools.build_meta" [tool.corio.metadata] -version = "0.3.10-alpha000" +version = "0.4.0" port = 6 base = "python" description = "Home Assistant Control Objects" @@ -38,7 +38,7 @@ env_list = [] [project] name = "haco" -version = "0.3.10-alpha000" +version = "0.4.0" description = "Home Assistant Control Objects" readme = "README.md" license = "Apache-2.0" From 0d6872797a4354c6f16b33b29321dd5bd933bc95 Mon Sep 17 00:00:00 2001 From: Edward Brown Date: Sun, 16 Aug 2026 16:15:50 +0100 Subject: [PATCH 10/12] Update paths import statement --- haco/paths.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/haco/paths.py b/haco/paths.py index aa2a0b4..25f0abf 100644 --- a/haco/paths.py +++ b/haco/paths.py @@ -3,6 +3,6 @@ Path definitions for the haco library. """ -from corio import sets +from corio import paths -paths = sets.PackagePaths() +paths = paths.PackagePaths() From c3299ab0c1f0aa248db9aea78e2b941569159d6b Mon Sep 17 00:00:00 2001 From: Edward Brown Date: Sun, 16 Aug 2026 16:20:38 +0100 Subject: [PATCH 11/12] Release version 0.4.1 --- pyproject.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5e67c3c..21273e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=82", "wheel"] build-backend = "setuptools.build_meta" [tool.corio.metadata] -version = "0.4.0" +version = "0.4.1" port = 6 base = "python" description = "Home Assistant Control Objects" @@ -24,7 +24,7 @@ include = ["haco*"] namespaces = false [tool.setuptools.package-data] -haco = ["pyproject.package.toml"] +haco = ["pyproject.package.toml", "assets/**"] [tool.uv.sources.corio] path = "../corio" @@ -38,19 +38,19 @@ env_list = [] [project] name = "haco" -version = "0.4.0" +version = "0.4.1" description = "Home Assistant Control Objects" readme = "README.md" license = "Apache-2.0" keywords = ["homeassistant", "controls", "python", "tasmota"] -dependencies = ["corio[api,caching,debug,logging,mqtt,sets,version.dev,yaml]~=2.7.3", "psutil"] +dependencies = ["corio[api,caching,debug,logging,mqtt,sets,version.dev,yaml]~=2.8.0", "psutil"] [[project.authors]] name = "Frontmatter AI" email = "innovative.fowler@mask.pro.fmtr.dev" [project.optional-dependencies] -test = ["corio[test]~=2.7.3"] +test = ["corio[test]~=2.8.0"] [project.urls] Homepage = "https://github.com/fmtr/haco" From 61ea555cf2e24c7c1fd24a923a242c78694978de Mon Sep 17 00:00:00 2001 From: Edward Brown Date: Mon, 17 Aug 2026 18:21:33 +0100 Subject: [PATCH 12/12] Release version 0.4.2 --- pyproject.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 21273e7..6b7e94f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=82", "wheel"] build-backend = "setuptools.build_meta" [tool.corio.metadata] -version = "0.4.1" +version = "0.4.2" port = 6 base = "python" description = "Home Assistant Control Objects" @@ -38,19 +38,19 @@ env_list = [] [project] name = "haco" -version = "0.4.1" +version = "0.4.2" description = "Home Assistant Control Objects" readme = "README.md" license = "Apache-2.0" keywords = ["homeassistant", "controls", "python", "tasmota"] -dependencies = ["corio[api,caching,debug,logging,mqtt,sets,version.dev,yaml]~=2.8.0", "psutil"] +dependencies = ["corio[api,caching,debug,logging,mqtt,sets,version.dev,yaml]~=2.8.2", "psutil"] [[project.authors]] name = "Frontmatter AI" email = "innovative.fowler@mask.pro.fmtr.dev" [project.optional-dependencies] -test = ["corio[test]~=2.8.0"] +test = ["corio[test]~=2.8.2"] [project.urls] Homepage = "https://github.com/fmtr/haco"