Compare commits

..

No commits in common. "main" and "v0.3.8-alpha000" have entirely different histories.

5 changed files with 10 additions and 38 deletions

View file

@ -1,6 +1,6 @@
# `haco` Home Assistant Control Objects
`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.
`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.
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, repr=False)
device: DeviceT | None = Field(default=None, exclude=True, 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 paths
from corio import sets
paths = paths.PackagePaths()
paths = sets.PackagePaths()

View file

@ -31,10 +31,6 @@ 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",
}
@ -63,34 +59,10 @@ 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", "parent"})
assert not any(key in data for key in {"capabilities", "subscriptions", "device", "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.4.2"
version = "0.3.8-alpha000"
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", "assets/**"]
haco = ["pyproject.package.toml"]
[tool.uv.sources.corio]
path = "../corio"
@ -38,19 +38,19 @@ env_list = []
[project]
name = "haco"
version = "0.4.2"
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.8.2", "psutil"]
dependencies = ["corio[api,caching,debug,logging,mqtt,sets,version.dev,yaml]~=2.3.0", "psutil"]
[[project.authors]]
name = "Frontmatter AI"
email = "innovative.fowler@mask.pro.fmtr.dev"
[project.optional-dependencies]
test = ["corio[test]~=2.8.2"]
test = ["pytest>=8.0", "pytest-cov>=5.0"]
[project.urls]
Homepage = "https://github.com/fmtr/haco"