5353CACHE_ENERGY_COLLECTION = "energy_collection"
5454CACHE_RELAY = "relay"
5555CACHE_RELAY_INIT = "relay_init"
56+ CACHE_RELAY_LOCK = "relay_lock"
5657
5758FuncT = TypeVar ("FuncT" , bound = Callable [..., Any ])
5859_LOGGER = logging .getLogger (__name__ )
@@ -184,6 +185,7 @@ def relay_lock(self) -> bool:
184185 async def set_relay_lock (self , state : bool ) -> None :
185186 """Set the state of the relay-lock."""
186187 self ._relay_lock = state
188+ await self ._relay_update_lock (state )
187189 await self .publish_feature_update_to_subscribers (
188190 NodeFeature .RELAY_LOCK , state
189191 )
@@ -680,20 +682,26 @@ async def set_relay(self, state: bool) -> bool:
680682 )
681683
682684 async def _relay_load_from_cache (self ) -> bool :
683- """Load relay state from cache."""
685+ """Load relay state and lock from cache."""
684686 if (cached_relay_data := self ._get_cache (CACHE_RELAY )) is not None :
685- _LOGGER .debug ("Restore relay state cache for node %s" , self ._mac_in_str )
686- relay_state = False
687+ cached_relay_lock = self ._get_cache (CACHE_RELAY_LOCK )
688+ _LOGGER .debug ("Restore relay state and lock cache for node %s" , self ._mac_in_str )
689+ relay_state = relay_lock = False
687690 if cached_relay_data == "True" :
688691 relay_state = True
692+ if cached_relay_lock == "True" :
693+ relay_lock = True
689694 await self ._relay_update_state (relay_state )
695+ await self ._relay_update_lock (relay_lock )
690696 return True
697+
691698 _LOGGER .debug (
692699 "Failed to restore relay state from cache for node %s, try to request node info..." ,
693700 self ._mac_in_str ,
694701 )
695702 if await self .node_info_update () is None :
696703 return False
704+
697705 return True
698706
699707 async def _relay_update_state (
@@ -705,17 +713,37 @@ async def _relay_update_state(
705713 self ._set_cache (CACHE_RELAY , "True" )
706714 if self ._relay_state .state is None or not self ._relay_state .state :
707715 state_update = True
708- if not state :
716+ else :
709717 self ._set_cache (CACHE_RELAY , "False" )
710718 if self ._relay_state .state is None or self ._relay_state .state :
711719 state_update = True
720+
712721 self ._relay_state = replace (self ._relay_state , state = state , timestamp = timestamp )
713722 if state_update :
714723 await self .publish_feature_update_to_subscribers (
715724 NodeFeature .RELAY , self ._relay_state
716725 )
717726 await self .save_cache ()
718727
728+ async def _relay_update_lock (self , lock : bool ) -> None :
729+ """Process relay lock update."""
730+ state_update = False
731+ if lock :
732+ self ._set_cache (CACHE_RELAY_LOCK , "True" )
733+ if not self ._relay_lock :
734+ state_update = True
735+ else :
736+ self ._set_cache (CACHE_RELAY_LOCK , "False" )
737+ if self ._relay_lock :
738+ state_update = True
739+
740+ self ._relay_state = replace (self ._relay_lock , state = lock )
741+ if state_update :
742+ await self .publish_feature_update_to_subscribers (
743+ NodeFeature .RELAY_LOCK , self ._relay_lock
744+ )
745+ await self .save_cache ()
746+
719747 async def clock_synchronize (self ) -> bool :
720748 """Synchronize clock. Returns true if successful."""
721749 get_clock_request = CircleClockGetRequest (self ._send , self ._mac_in_bytes )
@@ -899,14 +927,18 @@ async def node_info_update(
899927 if node_info is None :
900928 if self .skip_update (self ._node_info , 30 ):
901929 return self ._node_info
930+
902931 node_request = NodeInfoRequest (self ._send , self ._mac_in_bytes )
903932 node_info = await node_request .send ()
933+
904934 if node_info is None :
905935 return None
936+
906937 await super ().node_info_update (node_info )
907938 await self ._relay_update_state (
908939 node_info .relay_state , timestamp = node_info .timestamp
909940 )
941+ await self ._relay_update_lock (node_info .relay_lock )
910942 if self ._current_log_address is not None and (
911943 self ._current_log_address > node_info .current_logaddress_pointer
912944 or self ._current_log_address == 1
@@ -924,6 +956,7 @@ async def node_info_update(
924956 CACHE_CURRENT_LOG_ADDRESS , node_info .current_logaddress_pointer
925957 )
926958 await self .save_cache ()
959+
927960 return self ._node_info
928961
929962 async def _node_info_load_from_cache (self ) -> bool :
@@ -934,6 +967,7 @@ async def _node_info_load_from_cache(self) -> bool:
934967 ) is not None :
935968 self ._current_log_address = int (current_log_address )
936969 return result
970+
937971 return False
938972
939973 # pylint: disable=too-many-arguments
@@ -951,8 +985,10 @@ async def update_node_details(
951985 self ._relay_state = replace (
952986 self ._relay_state , state = relay_state , timestamp = timestamp
953987 )
988+
954989 if logaddress_pointer is not None :
955990 self ._current_log_address = logaddress_pointer
991+
956992 return await super ().update_node_details (
957993 firmware ,
958994 hardware ,
@@ -971,8 +1007,10 @@ async def unload(self) -> None:
9711007 ):
9721008 self ._retrieve_energy_logs_task .cancel ()
9731009 await self ._retrieve_energy_logs_task
1010+
9741011 if self ._cache_enabled :
9751012 await self ._energy_log_records_save_to_cache ()
1013+
9761014 await super ().unload ()
9771015
9781016 @raise_not_loaded
0 commit comments