From 2ca75d4128751544cc31699543032df618f92af3 Mon Sep 17 00:00:00 2001 From: Jeff Culverhouse Date: Wed, 5 Nov 2025 14:14:22 -0500 Subject: [PATCH] fix: return last known state if we fail to get current state, so upsert just works --- src/amcrest2mqtt/mixins/amcrest_api.py | 38 ++++++++++++++++++++------ src/amcrest2mqtt/mixins/refresh.py | 5 ---- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/amcrest2mqtt/mixins/amcrest_api.py b/src/amcrest2mqtt/mixins/amcrest_api.py index 6c804d6..bcc2852 100644 --- a/src/amcrest2mqtt/mixins/amcrest_api.py +++ b/src/amcrest2mqtt/mixins/amcrest_api.py @@ -120,19 +120,28 @@ class AmcrestAPIMixin: def get_storage_stats(self: Amcrest2Mqtt, device_id: str) -> dict[str, str | float]: device = self.amcrest_devices[device_id] + states = self.states[device_id] + + # return our last known state if we fail to get new stats + current: dict[str, str | float] = { + "used_percent": states["sensor"]["used_percent"], + "used": states["sensor"]["used"], + "total": states["sensor"]["total"], + } + if not device["camera"]: self.logger.warning(f"camera not found for {self.get_device_name(device_id)}") - return {} + return current try: storage = device["camera"].storage_all self.set_last_call_date() except CommError as err: self.logger.error(f"failed to get storage stats from ({self.get_device_name(device_id)}): {err}") - return {} + return current except LoginError as err: self.logger.error(f"failed to auth to ({self.get_device_name(device_id)}): {err}") - return {} + return current return { "used_percent": storage.get("used_percent", "unknown"), @@ -144,9 +153,14 @@ class AmcrestAPIMixin: def get_privacy_mode(self: Amcrest2Mqtt, device_id: str) -> bool: device = self.amcrest_devices[device_id] + states = self.states[device_id] + + # return our last known state if we fail to get new stats + current = bool(states["sensor"]["privacy"] == "ON") + if not device["camera"]: self.logger.warning(f"camera not found for {self.get_device_name(device_id)}") - return False + return current try: privacy = device["camera"].privacy_config().split() @@ -155,10 +169,10 @@ class AmcrestAPIMixin: self.set_last_call_date() except CommError as err: self.logger.error(f"failed to get privacy mode from ({self.get_device_name(device_id)}): {err}") - return False + return current except LoginError as err: self.logger.error(f"failed to auth to device ({self.get_device_name(device_id)}): {err}") - return False + return current return privacy_mode @@ -184,24 +198,30 @@ class AmcrestAPIMixin: def get_motion_detection(self: Amcrest2Mqtt, device_id: str) -> bool: device = self.amcrest_devices[device_id] + states = self.states[device_id] + + # return our last known state if we fail to get new stats + current = bool(states["sensor"]["motion_detection"] == "ON") + if not device["camera"]: self.logger.warning(f"camera not found for {self.get_device_name(device_id)}") - return False + return current try: motion_detection = bool(device["camera"].is_motion_detector_on()) self.set_last_call_date() except CommError as err: self.logger.error(f"failed to get motion detection switch on ({self.get_device_name(device_id)}): {err}") - return False + return current except LoginError as err: self.logger.error(f"failed to auth to device ({self.get_device_name(device_id)}): {err}") - return False + return current return motion_detection def set_motion_detection(self: Amcrest2Mqtt, device_id: str, switch: bool) -> str: device = self.amcrest_devices[device_id] + if not device["camera"]: self.logger.warning(f"camera not found for {self.get_device_name(device_id)}") return "" diff --git a/src/amcrest2mqtt/mixins/refresh.py b/src/amcrest2mqtt/mixins/refresh.py index 07afa55..3d2c5e8 100644 --- a/src/amcrest2mqtt/mixins/refresh.py +++ b/src/amcrest2mqtt/mixins/refresh.py @@ -21,11 +21,6 @@ class RefreshMixin: tasks = [] for device_id in self.devices: - if not self.running: - break - if device_id == "service": - continue tasks.append(_refresh(device_id)) - if tasks: await asyncio.gather(*tasks)