22
33from typing import TYPE_CHECKING , Any , Dict , Optional , Tuple , cast
44
5- from pydantic import BaseModel , Field
5+ from pydantic import Field , validator
66
7- from ...models import State
8- from ...models .domains import ServiceField
7+ from ...models import ServiceField , State , base
98
109if TYPE_CHECKING :
1110 from homeassistant_api import Client
1211
1312
14- class AsyncDomain (BaseModel ):
13+ class AsyncDomain (base . BaseModel ):
1514 """A class representing the domain that services belong to."""
1615
1716 domain_id : str
@@ -30,7 +29,7 @@ def add_service(self, service_id: str, **data) -> None:
3029 }
3130 )
3231
33- def get_service (self , service_id : str ):
32+ def get_service (self , service_id : str ) -> Optional [ "AsyncService" ] :
3433 """Return a Service with the given service_id, returns None if no such service exists"""
3534 return self .services .get (service_id )
3635
@@ -43,16 +42,25 @@ def __getattr__(self, attr: str):
4342 return super ().__getattribute__ (attr )
4443
4544
46- class AsyncService (BaseModel ):
45+ class AsyncService (base . BaseModel ):
4746 """Class representing services from homeassistant"""
4847
4948 service_id : str
50- domain : AsyncDomain
49+ domain : AsyncDomain = Field ( exlude = True , repr = False )
5150 name : Optional [str ] = None
5251 description : Optional [str ] = None
5352 fields : Optional [Dict [str , ServiceField ]] = None
5453 target : Optional [Dict [str , dict ]] = None
5554
55+ @classmethod
56+ @validator ("domain" )
57+ def validate_domain (cls , domain : AsyncDomain ) -> AsyncDomain :
58+ """
59+ Explicitly do nothing to validate the parent domain.
60+ Elimintates recursive validation errors.
61+ """
62+ return domain
63+
5664 async def async_trigger (self , ** service_data ) -> Tuple [State , ...]:
5765 """Triggers the service associated with this object."""
5866 data = await self .domain .client .async_trigger_service (
0 commit comments