Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion appdaemon/adapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -733,7 +733,7 @@ async def save_namespace(self, namespace: str | None = None) -> None:
>>> self.save_namespace()

"""
namespace = namespace or self.namespace
namespace = namespace if namespace is not None else self.namespace
await self.AD.state.save_namespace(namespace)

#
Expand Down
31 changes: 19 additions & 12 deletions appdaemon/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,10 +148,10 @@ async def add_persistent_namespace(self, namespace: str, writeback: str) -> Path
main thread. Otherwise, the DbfilenameShelf can get messed up because it's not
thread-safe. In some systems, it'll complain about being accessed from multiple
threads."""

if isinstance(self.state.get(namespace), utils.PersistentDict):
self.logger.info(f"Persistent namespace '{namespace}' already initialized")
return
match self.state.get(namespace):
case utils.PersistentDict():
self.logger.info(f"Persistent namespace '{namespace}' already initialized")
return

ns_db_path = self.namespace_db_path(namespace)
safe = writeback == "safe"
Expand Down Expand Up @@ -480,8 +480,13 @@ async def process_state_callbacks(self, namespace, state):
for remove in removes:
await self.cancel_state_callback(remove["uuid"], remove["name"])

def entity_exists(self, namespace: str, entity: str):
return namespace in self.state and entity in self.state[namespace]
def entity_exists(self, namespace: str, entity: str) -> bool:
match self.state.get(namespace):
case dict(ns_state):
match ns_state.get(entity):
case dict():
return True
return False

def get_entity(self, namespace: Optional[str] = None, entity_id: Optional[str] = None, name: Optional[str] = None):
if namespace is None:
Expand Down Expand Up @@ -835,17 +840,19 @@ def update_namespace_state(self, namespace: str | list[str], state: dict):
self.state[namespace].update(state)

async def save_namespace(self, namespace: str) -> None:
if isinstance((ns := self.state[namespace]), utils.PersistentDict):
ns.sync()
else:
self.logger.warning("Namespace: %s cannot be saved", namespace)
match self.state.get(namespace):
case utils.PersistentDict() as state:
self.logger.debug("Saving namespace: %s", namespace)
state.sync()
case _:
self.logger.warning("Namespace: %s cannot be saved", namespace)

def save_all_namespaces(self) -> None:
self.logger.debug("Saving all namespaces")
for ns, state in self.state.items():
match state:
case utils.PersistentDict():
self.logger.info("Saving persistent namespace: %s", ns)
case utils.PersistentDict() as state:
self.logger.debug("Saving namespace: %s", ns)
state.sync()

def save_hybrid_namespaces(self) -> None:
Expand Down
Loading