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,10 +927,13 @@ 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
@@ -924,6 +955,7 @@ async def node_info_update(
924955 CACHE_CURRENT_LOG_ADDRESS , node_info .current_logaddress_pointer
925956 )
926957 await self .save_cache ()
958+
927959 return self ._node_info
928960
929961 async def _node_info_load_from_cache (self ) -> bool :
@@ -934,6 +966,7 @@ async def _node_info_load_from_cache(self) -> bool:
934966 ) is not None :
935967 self ._current_log_address = int (current_log_address )
936968 return result
969+
937970 return False
938971
939972 # pylint: disable=too-many-arguments
@@ -951,8 +984,10 @@ async def update_node_details(
951984 self ._relay_state = replace (
952985 self ._relay_state , state = relay_state , timestamp = timestamp
953986 )
987+
954988 if logaddress_pointer is not None :
955989 self ._current_log_address = logaddress_pointer
990+
956991 return await super ().update_node_details (
957992 firmware ,
958993 hardware ,
@@ -971,8 +1006,10 @@ async def unload(self) -> None:
9711006 ):
9721007 self ._retrieve_energy_logs_task .cancel ()
9731008 await self ._retrieve_energy_logs_task
1009+
9741010 if self ._cache_enabled :
9751011 await self ._energy_log_records_save_to_cache ()
1012+
9761013 await super ().unload ()
9771014
9781015 @raise_not_loaded
0 commit comments