Compare commits

..

No commits in common. "main" and "v0.3.7" have entirely different histories.
main ... v0.3.7

5 changed files with 10 additions and 44 deletions

View file

@ -1,6 +1,6 @@
# `haco` Home Assistant Control Objects # `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. 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 name: str
icon: str | None = None 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) capabilities: list = Field(default_factory=list, exclude=True, repr=False)
unique_id: str | None = None unique_id: str | None = None
availability_topic: str | None = None availability_topic: str | None = None

View file

@ -3,6 +3,6 @@
Path definitions for the haco library. 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", "icon": "mdi:power",
"unique_id": "dev-main", "unique_id": "dev-main",
"availability_topic": "root/status", "availability_topic": "root/status",
"device": {
"name": "Dev",
"identifiers": ["dev"],
},
"state_topic": "root/client/dev/main/default/state", "state_topic": "root/client/dev/main/default/state",
"command_topic": "root/client/dev/main/default/command", "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", "power_state_topic",
} }
assert expected_subset.issubset(set(data)) 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()) 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(): def test_model_dump_excludes_runtime_extra_attributes():
switch = Switch(name="Main") switch = Switch(name="Main")
switch.dynamic_callback = lambda value: value switch.dynamic_callback = lambda value: value

View file

@ -3,7 +3,7 @@ requires = ["setuptools>=82", "wheel"]
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"
[tool.corio.metadata] [tool.corio.metadata]
version = "0.4.2" version = "0.3.7"
port = 6 port = 6
base = "python" base = "python"
description = "Home Assistant Control Objects" description = "Home Assistant Control Objects"
@ -24,33 +24,27 @@ include = ["haco*"]
namespaces = false namespaces = false
[tool.setuptools.package-data] [tool.setuptools.package-data]
haco = ["pyproject.package.toml", "assets/**"] haco = ["pyproject.package.toml"]
[tool.uv.sources.corio] [tool.uv.sources.corio]
path = "../corio" path = "../corio"
editable = true editable = true
[tool.tox]
requires = ["tox>=4.22", "tox-uv>=1"]
env_list = []
[tool.tox.env]
[project] [project]
name = "haco" name = "haco"
version = "0.4.2" version = "0.3.7"
description = "Home Assistant Control Objects" description = "Home Assistant Control Objects"
readme = "README.md" readme = "README.md"
license = "Apache-2.0" license = "Apache-2.0"
keywords = ["homeassistant", "controls", "python", "tasmota"] 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.2.2", "psutil"]
[[project.authors]] [[project.authors]]
name = "Frontmatter AI" name = "Frontmatter AI"
email = "innovative.fowler@mask.pro.fmtr.dev" email = "innovative.fowler@mask.pro.fmtr.dev"
[project.optional-dependencies] [project.optional-dependencies]
test = ["corio[test]~=2.8.2"] test = ["pytest>=8.0", "pytest-cov>=5.0"]
[project.urls] [project.urls]
Homepage = "https://github.com/fmtr/haco" Homepage = "https://github.com/fmtr/haco"