From 4011b76affd3a63dfe0289793e8d957b9e143334 Mon Sep 17 00:00:00 2001 From: Dominik Bacher Date: Tue, 25 Jul 2023 22:49:40 +0200 Subject: [PATCH] Parse ETS Functions (#254) * add room functions * rename to singular form and fix some issues. * Missing docstring in public method * fix ci * missing function docstring * add functions to old tests * fix typo * test stub * correct indent * correct isort * add identifier,name,role,ref_id,project_uid to group_addresse * add usage_text to functions * add address to function group addresses * remove ref_id from group_address * restore tox.ini * move functions to root level * use next to find ga address --------- Co-authored-by: Bacher, Dominik --- README.md | 1 + .../stubs/module-definition-test.json | 14 +- test/resources/stubs/test_project-ets4.json | 20 ++- .../stubs/testprojekt-ets6-functions.json | 131 ++++++++++++++++++ test/resources/stubs/xknx_test_project.json | 8 +- .../testprojekt-ets6-functions.knxproj | Bin 0 -> 94238 bytes test/test_knxproj.py | 10 ++ xknxproject/loader/knx_master_loader.py | 18 ++- xknxproject/loader/project_loader.py | 82 ++++++++++- xknxproject/models/__init__.py | 8 ++ xknxproject/models/knxproject.py | 23 +++ xknxproject/models/models.py | 26 ++++ xknxproject/xml/parser.py | 44 ++++++ 13 files changed, 361 insertions(+), 24 deletions(-) create mode 100644 test/resources/stubs/testprojekt-ets6-functions.json create mode 100755 test/resources/testprojekt-ets6-functions.knxproj diff --git a/README.md b/README.md index 40a91dd..00fe171 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Currently, xknxproject supports extracting (password protected) ETS 4, 5 and 6 p * Group Addresses and their DPT type if set * The application programs communication objects, their respective flags and the DPT Type * Location information of devices (in which rooms they are) +* Functions assigned to rooms Caution: Loading a middle-sized project with this tool takes about 1.5 seconds. For bigger projects this might as well be >3s. diff --git a/test/resources/stubs/module-definition-test.json b/test/resources/stubs/module-definition-test.json index fc62ccf..1766bbe 100644 --- a/test/resources/stubs/module-definition-test.json +++ b/test/resources/stubs/module-definition-test.json @@ -377,11 +377,15 @@ "description": "office description", "project_uid": 22, "devices": [], - "spaces": {} + "spaces": {}, + "functions": [] } - } + }, + "functions": [] } - } + }, + "functions": [] } - } -} \ No newline at end of file + }, + "functions": {} +} diff --git a/test/resources/stubs/test_project-ets4.json b/test/resources/stubs/test_project-ets4.json index fece112..8aa9edd 100644 --- a/test/resources/stubs/test_project-ets4.json +++ b/test/resources/stubs/test_project-ets4.json @@ -273,9 +273,11 @@ "devices": [ "0.0.2" ], - "spaces": {} + "spaces": {}, + "functions": [] } - } + }, + "functions": [] }, "Second floor": { "type": "Floor", @@ -300,11 +302,15 @@ "devices": [ "0.0.1" ], - "spaces": {} + "spaces": {}, + "functions": [] } - } + }, + "functions": [] } - } + }, + "functions": [] } - } -} \ No newline at end of file + }, + "functions": {} +} diff --git a/test/resources/stubs/testprojekt-ets6-functions.json b/test/resources/stubs/testprojekt-ets6-functions.json new file mode 100644 index 0000000..865247c --- /dev/null +++ b/test/resources/stubs/testprojekt-ets6-functions.json @@ -0,0 +1,131 @@ +{ + "info": { + "project_id": "P-05C0", + "name": "Minimal-Example", + "last_modified": "2023-07-07T12:41:11.4132414Z", + "group_address_style": "ThreeLevel", + "guid": "efabc0f9-4e81-440d-a236-b80913e85730", + "created_by": "ETS6", + "schema_version": "22", + "tool_version": "6.1.5686.0", + "xknxproject_version": "3.2.0", + "language_code": "de-DE" + }, + "communication_objects": {}, + "topology": { + "0": { + "name": "", + "description": null, + "lines": { + "0": { + "name": "", + "description": null, + "devices": [], + "medium_type": "KNXnet/IP (IP)" + } + } + }, + "1": { + "name": "", + "description": null, + "lines": { + "0": { + "name": "", + "description": null, + "devices": [], + "medium_type": "KNXnet/IP (IP)" + }, + "1": { + "name": "", + "description": null, + "devices": [], + "medium_type": "Twisted Pair (TP)" + } + } + } + }, + "devices": {}, + "group_addresses": { + "0/0/1": { + "name": "Schalten", + "identifier": "GA-1", + "raw_address": 1, + "address": "0/0/1", + "project_uid": 14, + "dpt": { + "main": 1, + "sub": 1 + }, + "communication_object_ids": [], + "description": "Livingroom LivingroomLight" + }, + "0/0/2": { + "name": "Status", + "identifier": "GA-2", + "raw_address": 2, + "address": "0/0/2", + "project_uid": 16, + "dpt": { + "main": 1, + "sub": 1 + }, + "communication_object_ids": [], + "description": "Livingroom LivingroomLight" + } + }, + "locations": { + "Minimal-Example": { + "type": "Building", + "identifier": "P-05C0-0_BP-1", + "name": "Minimal-Example", + "usage_id": null, + "usage_text": "", + "number": "", + "description": "", + "project_uid": 9, + "devices": [], + "spaces": { + "Livingroom": { + "type": "Room", + "identifier": "P-05C0-0_BP-2", + "name": "Livingroom", + "usage_id": "SU-4", + "usage_text": "Wohnzimmer", + "number": "", + "description": "", + "project_uid": 10, + "devices": [], + "spaces": {}, + "functions": [ + "F-1" + ] + } + }, + "functions": [] + } + }, + "functions": { + "F-1": { + "function_type": "FT-1", + "group_addresses": { + "0/0/1": { + "address": "0/0/1", + "name": "", + "project_uid": 15, + "role": "SwitchOnOff" + }, + "0/0/2": { + "address": "0/0/2", + "name": "", + "project_uid": 17, + "role": "InfoOnOff" + } + }, + "identifier": "F-1", + "name": "LivingroomLight", + "project_uid": 11, + "space_id": "P-05C0-0_BP-2", + "usage_text": "switchable light" + } + } +} diff --git a/test/resources/stubs/xknx_test_project.json b/test/resources/stubs/xknx_test_project.json index 66ba3b5..2127ae0 100644 --- a/test/resources/stubs/xknx_test_project.json +++ b/test/resources/stubs/xknx_test_project.json @@ -669,7 +669,9 @@ "description": "", "project_uid": 6, "devices": [], - "spaces": {} + "spaces": {}, + "functions": [] } - } -} \ No newline at end of file + }, + "functions": {} +} diff --git a/test/resources/testprojekt-ets6-functions.knxproj b/test/resources/testprojekt-ets6-functions.knxproj new file mode 100755 index 0000000000000000000000000000000000000000..decf8bb05cb540e2b691114e93e9804787affe9d GIT binary patch literal 94238 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 II{@JS0P<}hkN^Mx literal 0 HcmV?d00001 diff --git a/test/test_knxproj.py b/test/test_knxproj.py index 739d62a..34d7022 100644 --- a/test/test_knxproj.py +++ b/test/test_knxproj.py @@ -30,3 +30,13 @@ def test_parse_project_modules(): ) project = knxproj.parse() assert_stub(project, "module-definition-test.json") + + +def test_parse_project_ets6_with_functions(): + """Test parsing of ETS6 project with room functions.""" + knxproj = XKNXProj( + RESOURCES_PATH / "testprojekt-ets6-functions.knxproj", + language="De", # resolves to "de-DE" in parser for knx_master.xml + ) + project = knxproj.parse() + assert_stub(project, "testprojekt-ets6-functions.json") diff --git a/xknxproject/loader/knx_master_loader.py b/xknxproject/loader/knx_master_loader.py index 276180a..e2a344f 100644 --- a/xknxproject/loader/knx_master_loader.py +++ b/xknxproject/loader/knx_master_loader.py @@ -19,12 +19,13 @@ def load( knx_proj_contents: KNXProjContents, knx_master_file: Path, language: str | None, - ) -> tuple[dict[str, str], dict[str, str], str | None]: + ) -> tuple[dict[str, str], dict[str, str], str | None, dict[str, str]]: """Load KNX master data.""" manufacturer_mapping: dict[str, str] = {} space_usage_mapping: dict[str, str] = {} product_languages: list[str] = [] # eg. "en-US", "de-DE", "fr-FR" language_code: str | None = None + function_type_mapping: dict[str, str] = {} with knx_master_file.open(mode="rb") as master_xml: tree = ElementTree.parse(master_xml) @@ -44,6 +45,14 @@ def load( for language_node in tree.findall(".//{*}ProductLanguages/{*}Language"): product_languages.append(language_node.get("Identifier", "")) + for function_type_node in tree.findall( + ".//{*}FunctionTypes/{*}FunctionType" + ): + identifier = function_type_node.get("Id", "") + function_type_mapping[identifier] = function_type_node.get( + "Text", "" + ) + if language is not None: language_code = KNXMasterLoader.get_language_code( language, product_languages @@ -65,7 +74,12 @@ def load( ) is not None: space_usage_mapping[_ref_id] = translation_node.get("Text", "") - return manufacturer_mapping, space_usage_mapping, language_code + return ( + manufacturer_mapping, + space_usage_mapping, + language_code, + function_type_mapping, + ) @staticmethod def get_language_code(language: str, product_languages: list[str]) -> str | None: diff --git a/xknxproject/loader/project_loader.py b/xknxproject/loader/project_loader.py index 68fa8dc..273ed27 100644 --- a/xknxproject/loader/project_loader.py +++ b/xknxproject/loader/project_loader.py @@ -9,7 +9,9 @@ DeviceInstance, SpaceType, XMLArea, + XMLFunction, XMLGroupAddress, + XMLGroupAddressRef, XMLLine, XMLProjectInformation, XMLSpace, @@ -25,18 +27,21 @@ class ProjectLoader: def load( knx_proj_contents: KNXProjContents, space_usage_names: dict[str, str], + function_type_names: dict[str, str], ) -> tuple[ list[XMLGroupAddress], list[XMLArea], list[DeviceInstance], list[XMLSpace], XMLProjectInformation, + list[XMLFunction], ]: """Load topology mappings.""" areas: list[XMLArea] = [] devices: list[DeviceInstance] = [] group_address_list: list[XMLGroupAddress] = [] spaces: list[XMLSpace] = [] + functions: list[XMLFunction] = [] with knx_proj_contents.open_project_0() as project_0_file: tree = ElementTree.parse(project_0_file) @@ -62,18 +67,38 @@ def load( ) location_loader = _LocationLoader( - knx_proj_contents, devices, space_usage_names + knx_proj_contents, + devices, + space_usage_names, ) for location_element in tree.findall( f"{{*}}Project/{{*}}Installations/{{*}}Installation/{{*}}{element_name}" ): - spaces.extend(location_loader.load(location_element=location_element)) + spaces.extend( + location_loader.load( + location_element=location_element, functions=functions + ) + ) with knx_proj_contents.open_project_meta() as project_file: tree = ElementTree.parse(project_file) project_info = load_project_info(tree) - return group_address_list, areas, devices, spaces, project_info + for function in functions: + function.usage_text = ( + function_type_names.get(function.function_type, "") + if function.function_type + else "" + ) + + for group_address in function.group_addresses: + group_address.address = next( + ga.address + for ga in group_address_list + if ga.identifier == group_address.ref_id + ) + + return group_address_list, areas, devices, spaces, project_info, functions class _GroupAddressLoader: @@ -245,14 +270,18 @@ def __init__( } self.space_usage_names = space_usage_names - def load(self, location_element: ElementTree.Element) -> list[XMLSpace]: + def load( + self, location_element: ElementTree.Element, functions: list[XMLFunction] + ) -> list[XMLSpace]: """Load Location mappings.""" return [ - self.parse_space(space) + self.parse_space(space, functions) for space in location_element.findall(f"{{*}}{self._element_name}") ] - def parse_space(self, node: ElementTree.Element) -> XMLSpace: + def parse_space( + self, node: ElementTree.Element, functions: list[XMLFunction] + ) -> XMLSpace: """Parse a space from the document.""" usage_id = node.get("Usage") usage_text = self.space_usage_names.get(usage_id, "") if usage_id else "" @@ -268,18 +297,57 @@ def parse_space(self, node: ElementTree.Element) -> XMLSpace: project_uid=int(project_uid) if project_uid else None, spaces=[], devices=[], + functions=[], ) for sub_node in node: if sub_node.tag.endswith(self._element_name): # recursively call parse space since this can be nested for an unbound time in the XSD - space.spaces.append(self.parse_space(sub_node)) + space.spaces.append(self.parse_space(sub_node, functions)) elif sub_node.tag.endswith("DeviceInstanceRef"): if individual_address := self.devices.get(sub_node.get("RefId", "")): space.devices.append(individual_address) + elif sub_node.tag.endswith("Function"): + function = self.parse_functions(sub_node) + function.space_id = space.identifier + functions.append(function) + space.functions.append(function.identifier) return space + def parse_functions(self, node: ElementTree.Element) -> XMLFunction: + """Parse a functions from the document.""" + identifier = node.get("Id", "").split("_")[1] + project_uid = node.get("Puid") + function_type = node.get("Type", "") + + functions: XMLFunction = XMLFunction( + identifier=identifier, + name=node.get("Name"), # type: ignore[arg-type] + function_type=function_type, + project_uid=int(project_uid) if project_uid else None, + group_addresses=[], + usage_text="", + space_id="", + ) + + for sub_node in node: + if sub_node.tag.endswith("GroupAddressRef"): + project_uid = sub_node.get("Puid") + ref_id = sub_node.get("RefId", "").split("_")[1] + + group_address_ref: XMLGroupAddressRef = XMLGroupAddressRef( + ref_id=ref_id, + identifier=sub_node.get("Id"), # type: ignore[arg-type] + name=sub_node.get("Name"), # type: ignore[arg-type] + role=sub_node.get("Role", ""), + project_uid=int(project_uid) if project_uid else None, + address="", + ) + functions.group_addresses.append(group_address_ref) + + return functions + def load_project_info(tree: ElementTree.ElementTree) -> XMLProjectInformation: """Load project information.""" diff --git a/xknxproject/models/__init__.py b/xknxproject/models/__init__.py index 71ce812..36fd951 100644 --- a/xknxproject/models/__init__.py +++ b/xknxproject/models/__init__.py @@ -5,7 +5,9 @@ Device, DPTType, Flags, + Function, GroupAddress, + GroupAddressRef, KNXProject, Line, ProjectInfo, @@ -19,7 +21,9 @@ HardwareToPrograms, Product, XMLArea, + XMLFunction, XMLGroupAddress, + XMLGroupAddressRef, XMLLine, XMLProjectInformation, XMLSpace, @@ -37,6 +41,8 @@ "Line", "ProjectInfo", "Space", + "Function", + "GroupAddressRef", "ComObject", "ComObjectInstanceRef", "ComObjectRef", @@ -47,6 +53,8 @@ "XMLGroupAddress", "XMLLine", "XMLSpace", + "XMLFunction", + "XMLGroupAddressRef", "XMLProjectInformation", "MEDIUM_TYPES", "SpaceType", diff --git a/xknxproject/models/knxproject.py b/xknxproject/models/knxproject.py index d9dd790..f7b3856 100644 --- a/xknxproject/models/knxproject.py +++ b/xknxproject/models/knxproject.py @@ -92,6 +92,28 @@ class Space(TypedDict): project_uid: int | None devices: list[str] spaces: dict[str, Space] + functions: list[str] + + +class Function(TypedDict): + """Function typed dict.""" + + function_type: str + group_addresses: dict[str, GroupAddressRef] + identifier: str + name: str + project_uid: int | None + space_id: str + usage_text: str + + +class GroupAddressRef(TypedDict): + """GroupAddressRef typed dict.""" + + address: str + name: str + project_uid: int | None + role: str class ProjectInfo(TypedDict): @@ -118,3 +140,4 @@ class KNXProject(TypedDict): topology: dict[str, Area] locations: dict[str, Space] group_addresses: dict[str, GroupAddress] + functions: dict[str, Function] diff --git a/xknxproject/models/models.py b/xknxproject/models/models.py index ca77fda..c3db69e 100644 --- a/xknxproject/models/models.py +++ b/xknxproject/models/models.py @@ -273,6 +273,32 @@ class XMLSpace: project_uid: int | None spaces: list[XMLSpace] devices: list[str] # [DeviceInstance.individual_address] + functions: list[str] + + +@dataclass +class XMLFunction: + """A functions in the space XML.""" + + function_type: str + group_addresses: list[XMLGroupAddressRef] + identifier: str + name: str + project_uid: int | None + space_id: str + usage_text: str + + +@dataclass +class XMLGroupAddressRef: + """A GroupAddressRef in the functions XML.""" + + address: str + identifier: str + name: str + project_uid: int | None + ref_id: str + role: str @dataclass diff --git a/xknxproject/xml/parser.py b/xknxproject/xml/parser.py index ffb6d87..d75498e 100644 --- a/xknxproject/xml/parser.py +++ b/xknxproject/xml/parser.py @@ -17,7 +17,9 @@ Device, DeviceInstance, Flags, + Function, GroupAddress, + GroupAddressRef, HardwareToPrograms, KNXProject, Line, @@ -25,7 +27,9 @@ ProjectInfo, Space, XMLArea, + XMLFunction, XMLGroupAddress, + XMLGroupAddressRef, XMLProjectInformation, XMLSpace, ) @@ -47,6 +51,7 @@ def __init__(self, knx_proj_contents: KNXProjContents) -> None: self.language_code: str | None = None self.project_info: XMLProjectInformation + self.functions: list[XMLFunction] = [] def parse(self, language: str | None = None) -> KNXProject: """Parse ETS files.""" @@ -140,6 +145,10 @@ def parse(self, language: str | None = None) -> KNXProject: for space in self.spaces: space_dict[space.name] = self.recursive_convert_spaces(space) + functions_dict: dict[str, Function] = {} + for function in self.functions: + functions_dict[function.identifier] = self.convert_functions(function) + info = ProjectInfo( project_id=self.project_info.project_id, name=self.project_info.name, @@ -160,6 +169,37 @@ def parse(self, language: str | None = None) -> KNXProject: devices=devices_dict, group_addresses=group_address_dict, locations=space_dict, + functions=functions_dict, + ) + + def convert_group_address_ref( + self, group_address_ref: XMLGroupAddressRef + ) -> GroupAddressRef: + """Convert group address ref to the final output format.""" + return GroupAddressRef( + address=group_address_ref.address, + name=group_address_ref.name, + project_uid=group_address_ref.project_uid, + role=group_address_ref.role, + ) + + def convert_functions(self, function: XMLFunction) -> Function: + """Convert function to the final output format.""" + + ga_dict = {} + for group_address in function.group_addresses: + ga_dict[group_address.address] = self.convert_group_address_ref( + group_address + ) + + return Function( + function_type=function.function_type, + group_addresses=ga_dict, + identifier=function.identifier, + name=function.name, + project_uid=function.project_uid, + space_id=function.space_id, + usage_text=function.usage_text, ) def recursive_convert_spaces(self, space: XMLSpace) -> Space: @@ -179,6 +219,7 @@ def recursive_convert_spaces(self, space: XMLSpace) -> Space: project_uid=space.project_uid, devices=space.devices, spaces=subspaces, + functions=space.functions, ) def load(self, language: str | None) -> None: @@ -187,6 +228,7 @@ def load(self, language: str | None) -> None: manufacturer_names, space_usage_names, self.language_code, + function_type_names, ) = KNXMasterLoader.load( knx_proj_contents=self.knx_proj_contents, knx_master_file=self.knx_proj_contents.root_path / "knx_master.xml", @@ -198,9 +240,11 @@ def load(self, language: str | None) -> None: self.devices, self.spaces, self.project_info, + self.functions, ) = ProjectLoader.load( knx_proj_contents=self.knx_proj_contents, space_usage_names=space_usage_names, + function_type_names=function_type_names, ) products_dict: dict[str, Product] = {}