1 """Handle KNX project data."""
3 from __future__
import annotations
5 from dataclasses
import dataclass
7 from typing
import Final
10 from xknx.dpt
import DPTBase
11 from xknx.telegram.address
import DeviceAddressableType, GroupAddress, GroupAddressType
12 from xknxproject
import XKNXProj
13 from xknxproject.models
import (
16 GroupAddress
as GroupAddressModel,
17 GroupAddressStyle
as XknxProjectGroupAddressStyle,
18 KNXProject
as KNXProjectModel,
27 from .const
import DOMAIN
29 _LOGGER = logging.getLogger(__name__)
31 STORAGE_VERSION: Final = 1
32 STORAGE_KEY: Final = f
"{DOMAIN}/knx_project.json"
37 """Group address info for runtime usage."""
44 transcoder: type[DPTBase] |
None
48 """Convert GroupAddress dict value into GroupAddressInfo instance."""
50 transcoder = DPTBase.transcoder_by_dpt(dpt[
"main"], dpt.get(
"sub"))
if dpt
else None
52 address=ga_model[
"address"],
53 name=ga_model[
"name"],
54 description=ga_model[
"description"],
55 transcoder=transcoder,
56 dpt_main=dpt[
"main"]
if dpt
else None,
57 dpt_sub=dpt[
"sub"]
if dpt
else None,
62 """Manage KNX project data."""
65 devices: dict[str, Device]
66 group_addresses: dict[str, GroupAddressInfo]
67 info: ProjectInfo |
None
74 """Initialize project data."""
76 self.
_store_store = Store[KNXProjectModel](hass, STORAGE_VERSION, STORAGE_KEY)
81 """Set initial state for project data."""
88 self, xknx: XKNX, data: KNXProjectModel |
None =
None
90 """Load project data from storage."""
92 self.
devicesdevices = project[
"devices"]
93 self.
infoinfo = project[
"info"]
95 xknx.group_address_dpt.clear()
96 xknx_ga_dict: dict[DeviceAddressableType, DPTType] = {}
98 for ga_model
in project[
"group_addresses"].values():
101 if (dpt_model := ga_model.get(
"dpt"))
is not None:
102 xknx_ga_dict[ga_model[
"address"]] = dpt_model
104 xknx.group_address_dpt.set(xknx_ga_dict)
107 "Loaded KNX project data with %s group addresses from storage",
113 self, xknx: XKNX, file_id: str, password: str
115 """Process an uploaded project file."""
117 def _parse_project() -> KNXProjectModel:
122 language=self.
hasshass.config.language,
124 return xknxproj.parse()
126 project = await self.
hasshass.async_add_executor_job(_parse_project)
131 """Remove project file from storage."""
136 """Load the project file from local storage."""
140 """Return the address format for group addresses used in the project."""
142 match self.
infoinfo[
"group_address_style"]:
143 case XknxProjectGroupAddressStyle.TWOLEVEL.value:
144 return GroupAddressType.SHORT
145 case XknxProjectGroupAddressStyle.FREE.value:
146 return GroupAddressType.FREE
147 return GroupAddressType.LONG
None __init__(self, HomeAssistant hass, ConfigEntry entry)
None load_project(self, XKNX xknx, KNXProjectModel|None data=None)
None process_project_file(self, XKNX xknx, str file_id, str password)
KNXProjectModel|None get_knxproject(self)
GroupAddressType get_address_format(self)
None remove_project_file(self)
Iterator[Path] process_uploaded_file(HomeAssistant hass, str file_id)
GroupAddressInfo _create_group_address_info(GroupAddressModel ga_model)
None async_load(HomeAssistant hass)
None async_remove(HomeAssistant hass, str intent_type)
None async_save(self, _T data)