19 lines
844 B
Python
19 lines
844 B
Python
"""Pure timestamp validation for reported sensor snapshots."""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from math import isfinite
|
|
|
|
|
|
def freshness(reported: datetime | None, now: datetime, max_age_seconds: float) -> dict:
|
|
"""Use report time, not value-change time; reject unknown/future clocks."""
|
|
if not isfinite(max_age_seconds) or max_age_seconds <= 0:
|
|
raise ValueError("Freshness limit must be positive and finite")
|
|
if not isinstance(reported, datetime) or reported.tzinfo is None:
|
|
return {"status": "invalid_timestamp", "age_seconds": None}
|
|
age = (now - reported).total_seconds()
|
|
if age < 0:
|
|
return {"status": "future_timestamp", "age_seconds": round(age, 1)}
|
|
return {"status": "stale" if age > max_age_seconds else "valid",
|
|
"age_seconds": round(age, 1)}
|