Add Control.DATA for static announce data

This commit is contained in:
Edward Brown 2025-11-23 11:54:24 +00:00
parent 9fe9db547e
commit 70afdf1857
8 changed files with 40 additions and 25 deletions

View file

@ -6,8 +6,10 @@ from typing import Any
@dataclass(kw_only=True) @dataclass(kw_only=True)
class Base: class Base:
DATA = dict()
def model_dump(self) -> dict[str, Any]: def model_dump(self) -> dict[str, Any]:
data = {} data = {} | self.DATA
for fld in fields(self): for fld in fields(self):
meta = fld.metadata meta = fld.metadata
if meta.get('exclude', False): if meta.get('exclude', False):

View file

@ -1,15 +1,20 @@
from dataclasses import dataclass from dataclasses import dataclass
from typing import Literal
from control import Control from control import Control
from haco.capabilities import Capability
@dataclass(kw_only=True) @dataclass(kw_only=True)
class Button(Control): class Button(Control):
platform: Literal["climate"] = "button" DATA = dict(
platform='button'
)
def command(self, value): def command(self, value):
raise NotImplementedError() raise NotImplementedError()
def state(self, value): @classmethod
raise NotImplementedError() def get_capabilities(cls):
return [
Capability(name=None, state=None)
]

View file

@ -1,6 +1,5 @@
import asyncio
import aiomqtt import aiomqtt
import asyncio
from fmtr.tools import mqtt, Constants from fmtr.tools import mqtt, Constants
from fmtr.tools.json_tools import to_json from fmtr.tools.json_tools import to_json
@ -40,7 +39,8 @@ class ClientHaco(mqtt.Client):
# Echo back as new state # Echo back as new state
topic_state = topic_command.state topic_state = topic_command.state
await topic_state.wrap_back(echo_val) if topic_state:
await topic_state.wrap_back(echo_val)
async def start(self): async def start(self):
while True: while True:

View file

@ -7,7 +7,11 @@ from control import Control
@dataclass(kw_only=True) @dataclass(kw_only=True)
class Climate(Control): class Climate(Control):
platform: Literal["climate"] = "climate" DATA = dict(
platform='climate'
)
temperature_unit: Literal["C", "F"] = "C" temperature_unit: Literal["C", "F"] = "C"
temperature_min: float = 0 temperature_min: float = 0
temperature_max: float = 40 temperature_max: float = 40

View file

@ -14,7 +14,7 @@ if TYPE_CHECKING:
@dataclass(kw_only=True) @dataclass(kw_only=True)
class Control(Base): class Control(Base):
name: str name: str
platform: str
device: Device = field(default=None, init=False) device: Device = field(default=None, init=False)
capabilities: None | list[Capability] = field(default=None, metadata=dict(exclude=True)) capabilities: None | list[Capability] = field(default=None, metadata=dict(exclude=True))
@ -69,7 +69,7 @@ class Control(Base):
@property @property
def announce_topic(self): def announce_topic(self):
return f"homeassistant/{self.platform}/{self.unique_id}/config" return f"homeassistant/{self.DATA['platform']}/{self.unique_id}/config"
def get_availability_topic(self) -> str: def get_availability_topic(self) -> str:
return self.device.client.will.topic return self.device.client.will.topic

View file

@ -1,18 +1,18 @@
from typing import List from dataclasses import dataclass
from haco.control import Control from control import Control
@dataclass(kw_only=True)
class Select(Control): class Select(Control):
NAME = 'select' DATA = dict(
platform='select'
)
def __init__(self, name, options: List[str], icon=None): options: list[str]
self.options = options
super().__init__(name, icon=icon)
def get_config_ha_ex(self): def command(self, value):
data = { raise NotImplementedError()
'options': self.options,
}
return data def state(self, value):
raise NotImplementedError()

View file

@ -5,6 +5,7 @@ from haco.client import ClientHaco
from haco.climate import Climate from haco.climate import Climate
from haco.constants import MQTT_HOST from haco.constants import MQTT_HOST
from haco.device import Device from haco.device import Device
from haco.pulldown import Select
from haco.switch import Switch from haco.switch import Switch
@ -15,7 +16,8 @@ async def main():
b1 = Button(name="Dev Button 1") b1 = Button(name="Dev Button 1")
s1 = Switch(name="Dev Switch 1") s1 = Switch(name="Dev Switch 1")
device = Device(name="Dev Device", controls=[climate_a, climate_b, b1, s1]) sel1 = Select(name="Dev Select 1", options=['a', 'b', 'c'])
device = Device(name="Dev Device", controls=[climate_a, climate_b, b1, s1, sel1])
client = ClientHaco(hostname=MQTT_HOST, device=device) client = ClientHaco(hostname=MQTT_HOST, device=device)

View file

@ -1,12 +1,14 @@
from dataclasses import dataclass from dataclasses import dataclass
from typing import Literal
from control import Control from control import Control
@dataclass(kw_only=True) @dataclass(kw_only=True)
class Switch(Control): class Switch(Control):
platform: Literal["climate"] = "switch" DATA = dict(
platform='switch'
)
def command(self, value): def command(self, value):
raise NotImplementedError() raise NotImplementedError()