via_home: add accuracy, cache history

This commit is contained in:
Sean Breckenridge 2023-02-15 22:28:07 -08:00
parent 02ea0b26dd
commit 36beab5f17
2 changed files with 17 additions and 4 deletions

View file

@ -73,6 +73,7 @@ class location:
# todo ugh, need to think about it... mypy wants the type here to be general, otherwise it can't deduce
# and we can't import the types from the module itself, otherwise would be circular. common module?
home: Union[LatLon, Sequence[Tuple[DateIsh, LatLon]]] = (1.0, -1.0)
home_accuracy = 1000.0
class via_ip:
accuracy: float

View file

@ -5,7 +5,7 @@ Simple location provider, serving as a fallback when more detailed data isn't av
from dataclasses import dataclass
from datetime import datetime, time, timezone
from functools import lru_cache
from typing import Sequence, Tuple, Union, cast
from typing import Sequence, Tuple, Union, cast, List
from my.config import location as user_config
@ -21,6 +21,12 @@ class Config(user_config):
LatLon, # the location
]]
]
# default ~1km accuracy
# this is called 'home_accuracy' since it lives on the base location.config object,
# to differentiate it from accuracy for other providers
home_accuracy: float = 1000
# TODO could make current Optional and somehow determine from system settings?
@property
def _history(self) -> Sequence[Tuple[datetime, LatLon]]:
@ -73,17 +79,22 @@ def get_location(dt: datetime) -> LatLon:
return hist[-1][1]
# TODO: in python3.9, use functools.cached_property instead?
@lru_cache(maxsize=None)
def homes_cached() -> List[Tuple[datetime, LatLon]]:
return list(config._history)
def estimate_location(dt: Union[datetime, int, float]) -> FallbackLocation:
from my.location.fallback.common import _datetime_timestamp
d: float = _datetime_timestamp(dt)
# TODO: cache this?
hist = list(reversed(config._history))
hist = list(reversed(homes_cached()))
for pdt, (lat, lon) in hist:
if d >= pdt.timestamp():
# TODO: add accuracy?
return FallbackLocation(
lat=lat,
lon=lon,
accuracy=config.home_accuracy,
dt=datetime.fromtimestamp(d, timezone.utc),
datasource='via_home')
else:
@ -92,5 +103,6 @@ def estimate_location(dt: Union[datetime, int, float]) -> FallbackLocation:
return FallbackLocation(
lat=lat,
lon=lon,
accuracy=config.home_accuracy,
dt=datetime.fromtimestamp(d, timezone.utc),
datasource='via_home')