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 )
@@ -665,20 +667,26 @@ async def set_relay(self, state: bool) -> bool:
665667 )
666668
667669 async def _relay_load_from_cache (self ) -> bool :
668- """Load relay state from cache."""
670+ """Load relay state and lock from cache."""
669671 if (cached_relay_data := self ._get_cache (CACHE_RELAY )) is not None :
670- _LOGGER .debug ("Restore relay state cache for node %s" , self ._mac_in_str )
671- relay_state = False
672+ cached_relay_lock = self ._get_cache (CACHE_RELAY_LOCK )
673+ _LOGGER .debug ("Restore relay state and lock cache for node %s" , self ._mac_in_str )
674+ relay_state = relay_lock = False
672675 if cached_relay_data == "True" :
673676 relay_state = True
677+ if cached_relay_lock == "True" :
678+ relay_lock = True
674679 await self ._relay_update_state (relay_state )
680+ await self ._relay_update_lock (relay_lock )
675681 return True
682+
676683 _LOGGER .debug (
677684 "Failed to restore relay state from cache for node %s, try to request node info..." ,
678685 self ._mac_in_str ,
679686 )
680687 if await self .node_info_update () is None :
681688 return False
689+
682690 return True
683691
684692 async def _relay_update_state (
@@ -690,17 +698,37 @@ async def _relay_update_state(
690698 self ._set_cache (CACHE_RELAY , "True" )
691699 if self ._relay_state .state is None or not self ._relay_state .state :
692700 state_update = True
693- if not state :
701+ else :
694702 self ._set_cache (CACHE_RELAY , "False" )
695703 if self ._relay_state .state is None or self ._relay_state .state :
696704 state_update = True
705+
697706 self ._relay_state = replace (self ._relay_state , state = state , timestamp = timestamp )
698707 if state_update :
699708 await self .publish_feature_update_to_subscribers (
700709 NodeFeature .RELAY , self ._relay_state
701710 )
702711 await self .save_cache ()
703712
713+ async def _relay_update_lock (self , lock : bool ) -> None :
714+ """Process relay lock update."""
715+ state_update = False
716+ if lock :
717+ self ._set_cache (CACHE_RELAY_LOCK , "True" )
718+ if not self ._relay_lock :
719+ state_update = True
720+ else :
721+ self ._set_cache (CACHE_RELAY_LOCK , "False" )
722+ if self ._relay_lock :
723+ state_update = True
724+
725+ self ._relay_lock = lock
726+ if state_update :
727+ await self .publish_feature_update_to_subscribers (
728+ NodeFeature .RELAY_LOCK , self ._relay_lock
729+ )
730+ await self .save_cache ()
731+
704732 async def clock_synchronize (self ) -> bool :
705733 """Synchronize clock. Returns true if successful."""
706734 get_clock_request = CircleClockGetRequest (self ._send , self ._mac_in_bytes )
@@ -884,10 +912,13 @@ async def node_info_update(
884912 if node_info is None :
885913 if self .skip_update (self ._node_info , 30 ):
886914 return self ._node_info
915+
887916 node_request = NodeInfoRequest (self ._send , self ._mac_in_bytes )
888917 node_info = await node_request .send ()
918+
889919 if node_info is None :
890920 return None
921+
891922 await super ().node_info_update (node_info )
892923 await self ._relay_update_state (
893924 node_info .relay_state , timestamp = node_info .timestamp
@@ -909,6 +940,7 @@ async def node_info_update(
909940 CACHE_CURRENT_LOG_ADDRESS , node_info .current_logaddress_pointer
910941 )
911942 await self .save_cache ()
943+
912944 return self ._node_info
913945
914946 async def _node_info_load_from_cache (self ) -> bool :
@@ -919,6 +951,7 @@ async def _node_info_load_from_cache(self) -> bool:
919951 ) is not None :
920952 self ._current_log_address = int (current_log_address )
921953 return result
954+
922955 return False
923956
924957 # pylint: disable=too-many-arguments
@@ -936,8 +969,10 @@ async def update_node_details(
936969 self ._relay_state = replace (
937970 self ._relay_state , state = relay_state , timestamp = timestamp
938971 )
972+
939973 if logaddress_pointer is not None :
940974 self ._current_log_address = logaddress_pointer
975+
941976 return await super ().update_node_details (
942977 firmware ,
943978 hardware ,
@@ -956,8 +991,10 @@ async def unload(self) -> None:
956991 ):
957992 self ._retrieve_energy_logs_task .cancel ()
958993 await self ._retrieve_energy_logs_task
994+
959995 if self ._cache_enabled :
960996 await self ._energy_log_records_save_to_cache ()
997+
961998 await super ().unload ()
962999
9631000 @raise_not_loaded
0 commit comments