47
47
MatterNodeEvent ,
48
48
NodePingResult ,
49
49
)
50
- from .const import PAA_ROOT_CERTS_DIR
50
+ from .const import DATA_MODEL_SCHEMA_VERSION , PAA_ROOT_CERTS_DIR
51
51
from .helpers .paa_certificates import fetch_certificates
52
52
53
53
if TYPE_CHECKING :
@@ -501,7 +501,7 @@ async def interview_node(self, node_id: int) -> None:
501
501
existing_info .date_commissioned if existing_info else datetime .utcnow ()
502
502
),
503
503
last_interview = datetime .utcnow (),
504
- interview_version = SCHEMA_VERSION ,
504
+ interview_version = DATA_MODEL_SCHEMA_VERSION ,
505
505
available = True ,
506
506
attributes = parse_attributes_from_read_result (read_response .tlvAttributes ),
507
507
)
@@ -1050,48 +1050,28 @@ async def _call_sdk(self, func: Callable[..., _T], *args: Any, **kwargs: Any) ->
1050
1050
),
1051
1051
)
1052
1052
1053
- async def _check_interview_and_subscription (
1054
- self , node_id : int , reschedule_interval : int = 30
1055
- ) -> None :
1056
- """Handle interview (if needed) and subscription for known node."""
1057
-
1053
+ async def _setup_node (self , node_id : int ) -> None :
1054
+ """Handle set-up of subscriptions and interview (if needed) for known/discovered node."""
1058
1055
if node_id not in self ._nodes :
1059
1056
raise NodeNotExists (f"Node { node_id } does not exist." )
1060
1057
1061
1058
# (re)interview node (only) if needed
1062
- node_data = self ._nodes . get ( node_id )
1059
+ node_data = self ._nodes [ node_id ]
1063
1060
if (
1064
- node_data is None
1065
- # re-interview if the schema has changed
1066
- or node_data .interview_version < SCHEMA_VERSION
1061
+ # re-interview if we dont have any node attributes (empty node)
1062
+ not node_data .attributes
1063
+ # re-interview if the data model schema has changed
1064
+ or node_data .interview_version != DATA_MODEL_SCHEMA_VERSION
1067
1065
):
1068
1066
try :
1069
1067
await self .interview_node (node_id )
1070
- except NodeNotResolving :
1071
- LOGGER .warning (
1072
- "Unable to interview Node %s as it is unavailable" ,
1073
- node_id ,
1074
- )
1075
- # NOTE: the node will be picked up by mdns discovery automatically
1076
- # when it becomes available again.
1077
- except NodeInterviewFailed :
1078
- LOGGER .warning (
1079
- "Unable to interview Node %s, will retry later in the background." ,
1080
- node_id ,
1081
- )
1082
- # reschedule interview on error
1083
- # increase interval at each attempt with maximum of
1084
- # MAX_POLL_INTERVAL seconds (= 10 minutes)
1085
- self ._schedule_interview (
1086
- node_id ,
1087
- min (reschedule_interval + 10 , MAX_POLL_INTERVAL ),
1088
- )
1068
+ except (NodeNotResolving , NodeInterviewFailed ) as err :
1069
+ LOGGER .warning ("Unable to interview Node %s" , exc_info = err )
1070
+ # NOTE: the node will be picked up by mdns discovery automatically
1071
+ # when it comes available again.
1089
1072
return
1090
1073
1091
1074
# setup subscriptions for the node
1092
- if node_id in self ._subscriptions :
1093
- return
1094
-
1095
1075
try :
1096
1076
await self ._subscribe_node (node_id )
1097
1077
except NodeNotResolving :
@@ -1102,26 +1082,6 @@ async def _check_interview_and_subscription(
1102
1082
# NOTE: the node will be picked up by mdns discovery automatically
1103
1083
# when it becomes available again.
1104
1084
1105
- def _schedule_interview (self , node_id : int , delay : int ) -> None :
1106
- """(Re)Schedule interview and/or initial subscription for a node."""
1107
- assert self .server .loop is not None
1108
- # cancel any existing (re)schedule timer
1109
- if existing := self ._sub_retry_timer .pop (node_id , None ):
1110
- existing .cancel ()
1111
-
1112
- def create_interview_task () -> None :
1113
- asyncio .create_task (
1114
- self ._check_interview_and_subscription (
1115
- node_id ,
1116
- )
1117
- )
1118
- # the handle to the timer can now be removed
1119
- self ._sub_retry_timer .pop (node_id , None )
1120
-
1121
- self ._sub_retry_timer [node_id ] = self .server .loop .call_later (
1122
- delay , create_interview_task
1123
- )
1124
-
1125
1085
async def _resolve_node (
1126
1086
self , node_id : int , retries : int = 2 , attempt : int = 1
1127
1087
) -> DeviceProxyWrapper :
@@ -1230,7 +1190,7 @@ async def _process_mdns_queue(
1230
1190
continue # node is already set-up, no action needed
1231
1191
LOGGER .info ("Node %s discovered on MDNS" , node_id )
1232
1192
# setup the node
1233
- await self ._check_interview_and_subscription (node_id )
1193
+ await self ._setup_node (node_id )
1234
1194
elif state_change == ServiceStateChange .Removed :
1235
1195
if not node .available :
1236
1196
continue # node is already offline, nothing to do
0 commit comments