fix: return last known state if we fail to get current state, so upsert just works

pull/106/head
Jeff Culverhouse 3 months ago
parent 40e235c2df
commit 2ca75d4128

@ -120,19 +120,28 @@ class AmcrestAPIMixin:
def get_storage_stats(self: Amcrest2Mqtt, device_id: str) -> dict[str, str | float]: def get_storage_stats(self: Amcrest2Mqtt, device_id: str) -> dict[str, str | float]:
device = self.amcrest_devices[device_id] 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"]: if not device["camera"]:
self.logger.warning(f"camera not found for {self.get_device_name(device_id)}") self.logger.warning(f"camera not found for {self.get_device_name(device_id)}")
return {} return current
try: try:
storage = device["camera"].storage_all storage = device["camera"].storage_all
self.set_last_call_date() self.set_last_call_date()
except CommError as err: except CommError as err:
self.logger.error(f"failed to get storage stats from ({self.get_device_name(device_id)}): {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: except LoginError as err:
self.logger.error(f"failed to auth to ({self.get_device_name(device_id)}): {err}") self.logger.error(f"failed to auth to ({self.get_device_name(device_id)}): {err}")
return {} return current
return { return {
"used_percent": storage.get("used_percent", "unknown"), "used_percent": storage.get("used_percent", "unknown"),
@ -144,9 +153,14 @@ class AmcrestAPIMixin:
def get_privacy_mode(self: Amcrest2Mqtt, device_id: str) -> bool: def get_privacy_mode(self: Amcrest2Mqtt, device_id: str) -> bool:
device = self.amcrest_devices[device_id] 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"]: if not device["camera"]:
self.logger.warning(f"camera not found for {self.get_device_name(device_id)}") self.logger.warning(f"camera not found for {self.get_device_name(device_id)}")
return False return current
try: try:
privacy = device["camera"].privacy_config().split() privacy = device["camera"].privacy_config().split()
@ -155,10 +169,10 @@ class AmcrestAPIMixin:
self.set_last_call_date() self.set_last_call_date()
except CommError as err: except CommError as err:
self.logger.error(f"failed to get privacy mode from ({self.get_device_name(device_id)}): {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: except LoginError as err:
self.logger.error(f"failed to auth to device ({self.get_device_name(device_id)}): {err}") self.logger.error(f"failed to auth to device ({self.get_device_name(device_id)}): {err}")
return False return current
return privacy_mode return privacy_mode
@ -184,24 +198,30 @@ class AmcrestAPIMixin:
def get_motion_detection(self: Amcrest2Mqtt, device_id: str) -> bool: def get_motion_detection(self: Amcrest2Mqtt, device_id: str) -> bool:
device = self.amcrest_devices[device_id] 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"]: if not device["camera"]:
self.logger.warning(f"camera not found for {self.get_device_name(device_id)}") self.logger.warning(f"camera not found for {self.get_device_name(device_id)}")
return False return current
try: try:
motion_detection = bool(device["camera"].is_motion_detector_on()) motion_detection = bool(device["camera"].is_motion_detector_on())
self.set_last_call_date() self.set_last_call_date()
except CommError as err: except CommError as err:
self.logger.error(f"failed to get motion detection switch on ({self.get_device_name(device_id)}): {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: except LoginError as err:
self.logger.error(f"failed to auth to device ({self.get_device_name(device_id)}): {err}") self.logger.error(f"failed to auth to device ({self.get_device_name(device_id)}): {err}")
return False return current
return motion_detection return motion_detection
def set_motion_detection(self: Amcrest2Mqtt, device_id: str, switch: bool) -> str: def set_motion_detection(self: Amcrest2Mqtt, device_id: str, switch: bool) -> str:
device = self.amcrest_devices[device_id] device = self.amcrest_devices[device_id]
if not device["camera"]: if not device["camera"]:
self.logger.warning(f"camera not found for {self.get_device_name(device_id)}") self.logger.warning(f"camera not found for {self.get_device_name(device_id)}")
return "" return ""

@ -21,11 +21,6 @@ class RefreshMixin:
tasks = [] tasks = []
for device_id in self.devices: for device_id in self.devices:
if not self.running:
break
if device_id == "service":
continue
tasks.append(_refresh(device_id)) tasks.append(_refresh(device_id))
if tasks: if tasks:
await asyncio.gather(*tasks) await asyncio.gather(*tasks)

Loading…
Cancel
Save