Compare commits

...

11 commits

Author SHA1 Message Date
Edward Brown
61ea555cf2 Release version 0.4.2 2026-08-17 18:21:33 +01:00
Edward Brown
c3299ab0c1 Release version 0.4.1 2026-08-16 16:20:38 +01:00
Edward Brown
0d6872797a Update paths import statement 2026-08-16 16:15:50 +01:00
Edward Brown
5fc71ce126 Release version 0.4.0 2026-08-15 12:37:36 +01:00
Edward Brown
1dc5b3711c Release version 0.3.10-alpha000 2026-08-15 12:35:10 +01:00
Edward Brown
953d31db55 Fix README typo 2026-05-18 11:57:19 +01:00
Edward Brown
aacb79ab61 Add unit test to ensure device announce data included in control announce 2026-05-17 13:42:50 +01:00
Edward Brown
57a5f5c329 Release version 0.3.9 2026-05-17 13:39:47 +01:00
Edward Brown
b4b7c44a64 Fix device announce data not being including in control announce 2026-05-17 13:38:57 +01:00
Edward Brown
26a93e9a89 Update test dep 2026-05-09 16:43:53 +01:00
Edward Brown
09f451348b Release version 0.3.8 2026-05-09 16:05:17 +01:00
5 changed files with 38 additions and 10 deletions

View file

@ -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.

View file

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

View file

@ -3,6 +3,6 @@
Path definitions for the haco library.
"""
from corio import sets
from corio import paths
paths = sets.PackagePaths()
paths = paths.PackagePaths()

View file

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

View file

@ -3,7 +3,7 @@ requires = ["setuptools>=82", "wheel"]
build-backend = "setuptools.build_meta"
[tool.corio.metadata]
version = "0.3.8-alpha000"
version = "0.4.2"
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.3.8-alpha000"
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.3.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 = ["pytest>=8.0", "pytest-cov>=5.0"]
test = ["corio[test]~=2.8.2"]
[project.urls]
Homepage = "https://github.com/fmtr/haco"