Skip to content
This repository has been archived by the owner on Oct 3, 2023. It is now read-only.

Commit

Permalink
Added walking sport in coros client mapping (#219)
Browse files Browse the repository at this point in the history
  • Loading branch information
kevforget authored Nov 2, 2022
1 parent d839866 commit 8959d7f
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 12 deletions.
32 changes: 20 additions & 12 deletions tapiriik/services/Coros/coros.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ class CorosService(ServiceBase):
ActivityType.CrossCountrySkiing: 19,
ActivityType.Snowboarding: 21,
ActivityType.DownhillSkiing: 21,
ActivityType.StrengthTraining: 23
ActivityType.StrengthTraining: 23,
ActivityType.Walking: 31
# ActivityType.Skating: "IceSkate",
# ActivityType.Rowing: "Rowing",
# ActivityType.Elliptical: "Elliptical",
Expand All @@ -107,7 +108,8 @@ class CorosService(ServiceBase):
19: ActivityType.CrossCountrySkiing,
20: ActivityType.Running,
21: ActivityType.DownhillSkiing,
23: ActivityType.StrengthTraining
23: ActivityType.StrengthTraining,
31: ActivityType.Walking
}

SupportedActivities = list(_activityTypeMappings.keys())
Expand Down Expand Up @@ -187,8 +189,6 @@ def _refresh_token(self, serviceRecord):


def DownloadActivityList(self, svcRecord, exhaustive=False):
activities = []
exclusions = []
activitiesData = []

# We refresh the token before asking for data
Expand Down Expand Up @@ -225,14 +225,19 @@ def DownloadActivityList(self, svcRecord, exhaustive=False):
params["startDate"] = startDate.strftime("%Y%m%d")
params["endDate"] = endDate.strftime("%Y%m%d")

return self._map_to_hub_activities(activitiesData)

for ride in activitiesData:
def _map_to_hub_activities(self, activities_data):
exclusions = []
activities = []
for ride in activities_data:
# Some king of factory design patern for instanciating an activity
activity = UploadedActivity()
activity.SourceServiceID = self.ID
# Puting UTC by default but it's possible to get possibles timezones and chose it randomly with the possible_timezones method.
# The only problem is the possility to select a non DST timezone for an activity in a DST one.
# self.possible_timezones(ride["startTimezone"]/4) <== keeping this in case of really needing timzones
# Putting UTC by default, but it's possible to get possibles
# timezones and chose it randomly with the possible_timezones method.
# The only problem is the possibility to select a non DST timezone for an activity in a DST one.
# self.possible_timezones(ride["startTimezone"]/4) <== keeping this in case of really needing timezones
activity.TZ = pytz.timezone("UTC")
activity.StartTime = datetime.fromtimestamp(ride["startTime"])
activity.EndTime = datetime.fromtimestamp(ride["endTime"])
Expand All @@ -249,12 +254,15 @@ def DownloadActivityList(self, svcRecord, exhaustive=False):

activity.Type = self._reverseActivityTypeMappings[ride["mode"]]
activity.Stats.Distance = ActivityStatistic(ActivityStatisticUnit.Meters, value=ride["distance"])
activity.Stats.Speed = ActivityStatistic(ActivityStatisticUnit.SecondsPerKilometer, avg=ride["avgSpeed"] if "avgSpeed" in ride else None, max=None)
activity.Stats.RunCadence.update(ActivityStatistic(ActivityStatisticUnit.StepsPerMinute, avg=ride["avgFrequency"]))
activity.Stats.Energy = ActivityStatistic(ActivityStatisticUnit.Kilocalories, value=(ride["calorie"]/1000))
activity.Stats.Speed = ActivityStatistic(ActivityStatisticUnit.SecondsPerKilometer,
avg=ride["avgSpeed"] if "avgSpeed" in ride else None, max=None)
activity.Stats.RunCadence.update(
ActivityStatistic(ActivityStatisticUnit.StepsPerMinute, avg=ride["avgFrequency"]))
activity.Stats.Energy = ActivityStatistic(ActivityStatisticUnit.Kilocalories,
value=(ride["calorie"] / 1000))
activity.FitFileUrl = ride["fitUrl"]

# As coros don't provide name in activity summary I temporarly put the activity name
# As coros don't provide name in activity summary I temporarily put the activity name
activity.Name = activity.Type

activity.AdjustTZ()
Expand Down
66 changes: 66 additions & 0 deletions tapiriik/testing/test_coros.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
from datetime import datetime
from unittest import TestCase

import pytz

from tapiriik.services.Coros import CorosService
from tapiriik.services.interchange import ActivityType, ActivityStatistic, ActivityStatisticUnit

Coros = CorosService()


# To run test : 'docker exec -it hub-decathlon-web-1 python manage.py test tapiriik.testing.test_coros'

class CorosTest(TestCase):

def test_map_to_hub_activities_walking(self):
# given
activities_data = [{
"avgFrequency": 117,
"avgHeartRate": 124,
"avgSpeed": 2.0,
"calorie": 520898.0,
"deviceName": "COROS APEX 46mm",
"distance": 1.0,
"duration": 3606,
"endTime": 1666948512,
"endTimezone": 8,
"fitUrl": "https://localhost:8000",
"labelId": "xxx",
"mode": 31,
"startTime": 1666944907,
"startTimezone": 8,
"step": 1092,
"subMode": 2
}]

# when
hub_activities, exclusions = Coros._map_to_hub_activities(activities_data)

# then
self.assertEqual(len(exclusions), 0, 'should have no error')

self.assertEqual(len(hub_activities), 1, 'should map one activity')

self.assertEqual(hub_activities[0].SourceServiceID, Coros.ID)
self.assertEqual(hub_activities[0].TZ, pytz.UTC)
self.assertEqual(hub_activities[0].StartTime, datetime.fromtimestamp(1666944907).astimezone(pytz.UTC))
self.assertEqual(hub_activities[0].EndTime, datetime.fromtimestamp(1666948512).astimezone(pytz.UTC))
self.assertEqual(hub_activities[0].ServiceData, {"ActivityID": "xxx"})
self.assertEqual(hub_activities[0].Type, ActivityType.Walking)
self.assertEqual(hub_activities[0].Stats.Distance, ActivityStatistic(ActivityStatisticUnit.Meters, 1.0))
self.assertEqual(
hub_activities[0].Stats.Energy,
ActivityStatistic(ActivityStatisticUnit.Kilocalories, 520.8980)
)
self.assertEqual(
hub_activities[0].Stats.Speed,
ActivityStatistic(ActivityStatisticUnit.SecondsPerKilometer, avg=2.0)
)
self.assertEqual(
hub_activities[0].Stats.RunCadence,
ActivityStatistic(ActivityStatisticUnit.StepsPerMinute, avg=117.0)
)
self.assertEqual(hub_activities[0].FitFileUrl, "https://localhost:8000")
self.assertEqual(hub_activities[0].Name, ActivityType.Walking)
self.assertIsNotNone(hub_activities[0].UID)

0 comments on commit 8959d7f

Please sign in to comment.