diff --git a/main.py b/main.py index 90e006b..d2b7e58 100644 --- a/main.py +++ b/main.py @@ -567,43 +567,44 @@ async def search(request): return web.json_response({'error': 'invalid area format in areas list'}, status=400) client = sensors_client - q = 'select "lat", "lon" from owntracks where "acc" < 100 and "name" = \'{}\' order by time asc'.format(name) + + where_clauses = [] + for area in areas: + sw = area['southWest'] + ne = area['northEast'] + where_clauses.append(f'("lat" >= {sw["lat"]} and "lat" <= {ne["lat"]} and "lon" >= {sw["lng"]} and "lon" <= {ne["lng"]})') + + full_where_clause = ' or '.join(where_clauses) + + q = f'select "lat", "lon" from owntracks where "acc" < 100 and "name" = \'{name}\' and ({full_where_clause}) order by time asc' points = list(client.query(q).get_points()) ranges = [] current_range = None + last_point_dt = None + GAP_THRESHOLD_MINUTES = 5 for point in points: - if point.get('lat') is None or point.get('lon') is None: - continue - - is_inside = False - for area in areas: - sw = area['southWest'] - ne = area['northEast'] - if sw['lat'] <= point['lat'] <= ne['lat'] and sw['lng'] <= point['lon'] <= ne['lng']: - is_inside = True - break - - # InfluxDB time format can vary. It's UTC (Z suffix). point_time_str = point['time'] if '.' in point_time_str: point_dt = datetime.strptime(point_time_str, '%Y-%m-%dT%H:%M:%S.%fZ') else: point_dt = datetime.strptime(point_time_str, '%Y-%m-%dT%H:%M:%SZ') - if is_inside: - if current_range is None: - current_range = {'start': point_dt, 'end': point_dt} - else: - current_range['end'] = point_dt + if current_range is None: + current_range = {'start': point_dt, 'end': point_dt} else: - if current_range is not None: + time_diff_minutes = (point_dt - last_point_dt).total_seconds() / 60 + if time_diff_minutes > GAP_THRESHOLD_MINUTES: ranges.append({ 'start': int(current_range['start'].timestamp()), 'end': int(current_range['end'].timestamp()) }) - current_range = None + current_range = {'start': point_dt, 'end': point_dt} + else: + current_range['end'] = point_dt + + last_point_dt = point_dt if current_range is not None: ranges.append({