@@ -26,7 +26,7 @@ def __init__(self, path: list[str] | None = None) -> None:
2626 if not hasattr (self , "attributes" ):
2727 self .attributes = {}
2828 self ._path : list [str ] = path or []
29- self .__sub_controller_tree : dict [str , BaseController ] = {}
29+ self .__sub_controller_tree : dict [str , SubController ] = {}
3030
3131 self ._bind_attrs ()
3232
@@ -56,7 +56,8 @@ def _bind_attrs(self) -> None:
5656 new_attribute = copy (attr )
5757 setattr (self , attr_name , new_attribute )
5858
59- self .attributes [attr_name ] = new_attribute
59+ if attr_name != "root_attribute" :
60+ self .attributes [attr_name ] = new_attribute
6061
6162 def register_sub_controller (self , name : str , sub_controller : SubController ):
6263 if name in self .__sub_controller_tree .keys ():
@@ -67,7 +68,16 @@ def register_sub_controller(self, name: str, sub_controller: SubController):
6768 self .__sub_controller_tree [name ] = sub_controller
6869 sub_controller .set_path (self .path + [name ])
6970
70- def get_sub_controllers (self ) -> dict [str , BaseController ]:
71+ if isinstance (sub_controller .root_attribute , Attribute ):
72+ if name in self .attributes :
73+ raise TypeError (
74+ f"Cannot set SubController `{ name } ` root attribute "
75+ f"on the parent controller `{ type (self ).__name__ } ` "
76+ f"as it already has an attribute of that name."
77+ )
78+ self .attributes [name ] = sub_controller .root_attribute
79+
80+ def get_sub_controllers (self ) -> dict [str , SubController ]:
7181 return self .__sub_controller_tree
7282
7383 def get_controller_mappings (self ) -> list [SingleMapping ]:
@@ -99,6 +109,7 @@ def _get_single_mapping(controller: BaseController) -> SingleMapping:
99109 for name , attribute in controller .attributes .items ()
100110 if attribute .enabled
101111 }
112+
102113 return SingleMapping (
103114 controller , scan_methods , put_methods , command_methods , enabled_attributes
104115 )
@@ -130,5 +141,7 @@ class SubController(BaseController):
130141 it as part of a larger device.
131142 """
132143
144+ root_attribute : Attribute | None = None
145+
133146 def __init__ (self ) -> None :
134147 super ().__init__ ()
0 commit comments