Sposób na przeniesienie sesji treningowych z serwisu Polar FLOW do Garmin Connect

W życiu każdego z nas przychodzi ten moment, że mamy czegoś serdecznie dość, ale czy jedną z takich rzeczy może być nasz treningowy przyjaciel? Może zacznę od początku…

Moja przygoda z pomiarami treningów

Nie lubię zmieniać czegoś co działa. Zmiana zazwyczaj podyktowana była chęcią rozwoju, zyskania jakiejś konkretnej cechy która pozwalała mi zmienić trening lub pozbycia sie problemu.

Moja historia biegowego sprzętu pomiarowego jest bardzo krótka. Moim pierwszym zegarkiem był Garmin Fenix 3, kolejnym Polar Vantage V. Jeśli dobrze orientujecie się w datach wydania każdego z zegarków sportowych zauważycie że nie robiłem tego za często.

Oba zegarki spełniamy swoje funkcje. Zakładałem buty, wybierałem odpowiedni przycisk i po chwili były gotowe do rejestrowania mojej sesji treningowej. Może poza Polarem przez błędy którego, do serwisu zgłaszałem niezliczone ilości problemów a sam zegarek wysyłałem do naprawy lub wymiany. Muszę przyznać ze serwis Polara zawsze bardzo profesjonalnie podchodził to moich zgłoszeń. Chociaż nie śledzę już kolejnych wersji zegarka, zakładam, że były to problemy które producent usunął.

Swoją drogą myślę, że część z nich była zabawna i na tyle irytująca, że nadawałaby się na osobny wpis na blogu ;)

Przyszedł czas na zmianę

Od 2018 na każdą trasę biegową zabierałem mojego partnera i był nim zegarek Polar Vantage V. Przyznam, że początkowo byłem dobrze nastawiony. Zegarek skierowany był do profesjonalnych biegaczy i oferował na swój czas kilka unikalnych funkcji, tj. pomiar mocy biegowej bez użycia specjalistycznych czujników. Od początku jednak nie czułem się z nim najlepiej ale postanowiłem dać mu szansę.

Nie potrafiłem ustawić wszystkich tych rzeczy, które po prostu były mi potrzebne podczas treningu, a które miałem w Garminie. Jako jeden z tych „problemów” był to, że automatyczne zliczanie dystansu co 1 km powodowała pojawianie się dodatkowej tarczy z informacją. Jeśli jednak robiłem trening na stadionie sam odbijałem odległość sposobem „na linie” i jeśli oba te momenty zgrały się w czasie przycisk łapiący lapa nie reagował do momentu kiedy automatyczna tarcza nie znikła z wyświetlacza. Muszę dodać ze trwało to w moim odczuciu kilka sek. I tak wiem, pewnie mogłem to jakoś obejść ale po prostu mi się nie chciało zmieniać tego z treningu na trening.

Inną z opcji, która mnie interesowała była możliwość śledzenia intensywności treningu. Sam nie potrafiłem się hamować i orałem ile było sił, co nie zawsze przekładało się na zyskanie najlepszej formy biegowej. Polar niestety nie potrafił mi w tym temacie pomóc. Patrząc na to jak analizował moje wyniki największe moje zdziwienie budziło to jak przewidywał czas pokonania 10km i pokazywał mi 45 min w momencie, gdy ja prawie każdy swój bieg kończyłem w okolicach 36-37 min. Coś tam po prostu nie grało. A może to ja nie pasowałem do ich algorytmów?

Z każdym miesiącem narastało we mnie uczucie, że przyszedł czas na zmianę i tak po kilku latach mimo dużego zniechęcenia ceną nowych zegarków Garmina, która wydaje się być w jakiś sposób na określona na stałym poziomie postanowiłem nabyć swój egzemplarz. Jeśli chodzi o markę Sunto, z uwagi na doświadczenie z Polarem nie chciałem ryzykować.

Dodatkowym atutem przemawiającym za wyborem Garmina była możliwość wykorzystania ich SDK i sprzedaż oprogramowania skierowanego właśnie na tą platformę. Także, nowy zegarek przede wszystkim stał się czymś na czym mogę odrobine zarobić.

Który model wybrałem? Rozważałem Forerunner 945 i Fenix 6 Pro. Oczywiście jak większość z Was włączając w to mnie chciałbym poczekać na Fenixa 7. Ten mimo, iż poprzednie daty wypuszczenia sugerowałyby jego pojawienie się w czerwcu bieżącego roku pewnie jeszcze długo każe nam na siebie czekać. Zakładam, iż nowy model Garmina z uwagi na dobrze idącą sprzedaż aktualnych wersji jeszcze chwile utrzyma pozycję lidera.

Zastanawialiście się kiedykolwiek co nowego może zaoferować Garmin w siódmej odsłonie Fenixa?

Przeniesienie danych

Zegarek kupiony, jestem po pierwszym treningu, więc przyszedł czas na analizę i zagłębianie się w tym co tygryski lubią najbardziej. Zajrzałem więc do serwisu Garmin Connect (GC) aby zobaczyć co powie mi o tym co wyprawiam na treningach i jak mogę wykorzystać to żeby robić je mądrzej. Co do SDK nie będe się tutaj rozpisywał bo kogo to interesuje?

I tutaj pojawia się problem bo przecież serwis nie ma dostępu do danych z poprzedniego zegarka przez co nie ma wszystkich moich sesji. Nie wie co robiłem przez ostatnie kilka lat. Rozpocząłem poszukiwania opcji przeniesienia danych. Niestety poza jedną aplikacją na mobilki, serwisem internetowym i dwoma rozwiązaniami w BASH i pythonie nie ma nic. Oba serwisy w swoich opcjach nie mają wzajemnej wymiany informacji.

No to może Strava, tam chyba można wszystko synchronizować? Owszem ale Strava lubi brać nasze dane, żeby później móc poprosić nas o opłaty za ich korzystanie. Niekoniecznie zainteresowana jest ich wysyłaniem w czeluści innych serwisów w tym GC.

Szybko przypominam sobie, że przecież jesteśmy w UE, mamy swoje prawa i Polar FLOW (PF) powinno mi dać możliwość pobrania moich danych. Opcje znalazłem po za zalogowaniu do mojego konta Account.polar.com. W menu pojawia się możliwość pobrania danych, klikamy czekamy na maila i po dłuższej chwili dane są u nas. Niestety po ich otrzymaniu stwierdziłem, że format tych danych nie jest w żaden sposób zrozumiały dla GC i nie będę mógł ich przenieść to tego właśnie serwisu.

Postanowiłem zgłębić temat. W serwisie GC znalazłem opcje importowania sesji pozostało więc tylko znaleźć pasującą do tego opcje w serwisie PF. Polar FLOW oferuje możliwość eksportu kilku formatów danych TCX, CSV, GPX i dane HRV. Pobrałem jeden przykładowy plik i spróbowałem wgrać go do GC. Moim oczom ukazał się problem. GC nie potrafił poradzić sobie z importem pliku. Na szczęście jeden z linków na który trafiłem w sieci w temacie importu danych mówił o braku kompatybilności obu formatów. Szybko udało i się zidentyfikować i usunąć problem z pliku TCX polara.

Dlaczego wybrałem TCX? Nie analizowałem obu formatów. Metodą prób i błędów zauważyłem, że PF w plikach w formacie TCX eksportuje więcej informacji (metryk). Jeśli będziecie powtarzać moje kroki sprawdźcie, który format bardziej Wam pasuje.

Miałem już zatem rozwiązanie wystarczyło pobrać plik z serwisu PF i wgrać go do GC. Proste prawda? Myślę, że gdybym nie biegał tak często pewnie byłoby to bardzo proste i skończyło by się na kilku kliknięciach. U mnie jednak były to dane z kilku lat, każdy rok to setki aktywności i tysiące przebiegniętych kilometrów. Klikanie w PF zajęło by mi bardzo dużo czasu i takie rozwiązanie nie wchodziło w grę.

Jeśli śledzicie moje wpisy wiecie, że często podbieram się własnymi rozwiązaniami. I tak było w tym przypadku. Szybko opracowałem program, który zalogował się do PF, zrzucił moje dane po czym bez problemu wgrał je do GC. Rozmiar pobranych przeze mnie plików TCX to kilka GB. Cały process trwał wprawdzie kilka godzin (głównie pobieranie danych) ale mi sie z tym nie śpieszyło.

Od tego momentu mogłem spokojnie oglądać wszystkie swoje sesje w jednym miejscu.

Technicznie o problemie słów kilka

Jeśli nie jesteś technicznym geekiem jak ja pewnie nie zainteresuje Cię ten akapit. Zakładam, że osób z podobnym problem jest wiele a ilość informacji, która pozwala go rozwiązać mało dlatego postaram się w skrócie opisać sposób w jaki udało mi się przenieść dane z serwisu PF do GC bez utraty jakichkolwiek metryk.

Pliki TCX z PF nie chcą być czytane przez Garmina i aby usunąć ten problem najprościej jest usunąć w plikach XML węzły Creator i Author. Dla przykłady, jeśli masz coś takiego w swoim pliku XML

... pozostała część Twojego pliku XML
			</Training>
			<Creator xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Device_t">
				<Name>Polar Vantage V</Name>
				<UnitId>0</UnitId>
				<ProductID>203</ProductID>
				<Version>
					<VersionMajor>5</VersionMajor>
					<VersionMinor>1</VersionMinor>
					<BuildMajor>0</BuildMajor>
					<BuildMinor>0</BuildMinor>
				</Version>
			</Creator>
		</Activity>
	</Activities>
	<Author xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Application_t">
		<Name>Polar Connect</Name>
		<Build>
			<Version>
				<VersionMajor>0</VersionMajor>
				<VersionMinor>0</VersionMinor>
			</Version>
		</Build>
		<LangID>EN</LangID>
		<PartNumber>XXX-XXXXX-XX</PartNumber>
	</Author>
</TrainingCenterDatabase>

Zamień to na taki fragment

... pozostała część Twojego pliku XML
			</Training>
		</Activity>
	</Activities>
</TrainingCenterDatabase>

Pobranie plików z PF sprowadza się do uwierzytelnionego odwołania do adresu https://flow.polar.com/api/export/training/tcx/12345, gdzie 12345 zamienić należy na numery Waszych sesji z PF. Adresy poprzednich lub następnych aktywności odczytać można z zawartości strony z aktywnością. Wystarczy zacząć od ostatniej i posuwać się wstecz.

Umieszczenie plików w serwisie GC to wywołanie metody POST na adresie https://connect.garmin.com/modern/proxy/upload-service/upload/.tcx Adres również wymaga uwierzytelnienia za pomocą loginu i hasła.

W skrócie to tyle. Reszta mojego rozwiązania to dosłownie kilka linii w języku C# i prosty interfejs użytkownika, który łączy to w całość. Jeśli interesuje Was to co przygotowałem dajcie znać w komentarzach.

Co zrobić jak żyć?

Jest kilka możliwości. Możesz odpuścić i nie przenosić tych danych. Zacznij nowy rozdział swojej biegowej kariery, a ze starych danych korzysta wyłącznie w serwisie Polar FLOW. Takie podejście ma oczywiście swoje wady bo jeśli lubisz analizować albo wracać do swoich wyników nie będzie tego jednego miejsca i tych samych narzędzi do ich analizy.

Są również serwisy takie jak tapiriik.com lub podobne jemu aplikacje mobilne. Nie odbierajcie tego proszę jako reklamy. Korzystałem z tych serwisów ale ich głównym problemem jest to ze trzeba im podać swoje dane do logowania. Czy to nie jest jednak jeden z najprostszych sposobów żeby utracić możliwość dostępu do swojego konta?

Jeśli macie odpowiednie umiejętności i tyle zapału co ja pewnie opracujecie sobie podobne rozwiązanie. W sieci znaleźć można też kilka (dwa) darmowych rozwiań, które pozwalają na automatyczne wgranie plików TCX oraz ich naprawę. Nie jest to jednak kompletne rozwiązanie i tak zostaje część wrzucenia plików ręcznie do serwisu Garmin Connect. Rozwiązania mogą również z uwagi na brak ich rozwoju stać się nieaktualne. Tak samo nieaktualna może stać sie z czasem moja metoda postępowania. Pozostaje liczyć na to ze producenci dogadają się i umożliwią użytkownikom łatwe przeniesienie danych.

Aktualizacja 2021-12-29

Jeden z użytkowników słusznie zauważył iż usunięcie węzłów Creator i Author powoduje niestety efekt, że przeniesione biegi owszem są widoczne w Garmin Connect i można je przeglądać jak każde inne ale dane w nich zawarte nie są brane pod uwagę w wyliczeniach niektórych statystyk.

Jeśli Ci to pasuje to nie ma sensu dalej czytać, jeśli jednak chciałbyś uwzględnić te dane to zamiast usuwać węzły Creator i Author skopiuj je z innego pobranego z Twojego garmin Connect pliku TCXa. Zwróć uwagę na to, aby w węzle Creator pojawiła się informacja o uzywamym przez Ciebie urządzeniu. Tak przygotowane pliki zaimportowane w serwisie GC powinny zostać uwzględnione w większej ilości statystyk.

Aktualizacja 2021-12-30

Wydaje się, że podany wyżej sposób nie działa dla niektórych statystyk, tj. pułap tlenowy. Porównując pliki TCX z urządzenia i ten, który próbowałem imprtować widać, iż nie niesie on informacji o efekcie treningu, który to ma pewnie wpływ na niektóre statystyki. Wydaje się zatem, że przeniesienie wszystkich danych nie jest możliwe o ile nie znajdę sposobu na ich ponowne przeliczenie – nad czym aktualnie pracuje :)

Aktualizacja 2021-12-30

W jednym z komentarzy wskazana została strona https://www.tredict.com/polarjson2fit-converter/ jako uproszczony sposób na migrację danych z Polara do GC. Przejście z plików json do FIT. Pliki json to jak wspomniałem wcześniej dane, które wyeksportować możemy z konta Polar. Przekonwertowane, czy raczej wygenerowane przez aplikacje tredict pliki FIT na podsrawie plików json z konta Polar można później zaimporotwać w Garmin Connect i to mi się faktycznie udało. GC nie zaprotestował i z powodzeniem zaimportował wygenerowany plik.

Patrząc jednak na wyniki, cały proces nie przeszedł pomyślnie. Na losowo wybranym pliku pojawiły się problemy z czasem. Dane zaimportowane do GC z przekonwertowanego przez tredict pliku FIT odbiegały lekko od rzeczywistośći :)

Błedne dane po imporcie
Poprawne dane

Pozostaje tylko liczyc na to, że programiści zauważą błąd i go poprawią. Metoda wydaje się zdecydowanie mniej czasochłonna od tych wcześniej pokazanych.

16 komentarzy

  1. Hej, ja bym chętnie spojrzał w kod źródłowy rozwiązania, które przygotowałeś. W szczególności interesuje mnie interfejs, bo sama automatyzacja wysyłania requestów to rzeczywiście kilka linii. Pozdrawiam ;)

    1. Cześć, dzięki za adres. Strona faktycznie poradziła sobie z odczytaniem również z mojego eksportu z Polara (plik json). Niestety prównując to do danych na polar Flow, czy importu TCX w Garminie nie wygląda to dobrze. Dane wydają się być przesunięte – pokaze to w poście. Muszę jednak przyznać, że Twoja metoda jest znacznie mniej czasochłonna. Jak poprawią problem będzie można z tego korzystać.

  2. Cześć. Próbuję, próbuję i coś mi nie idzie. Nie bardzo wiem odkąd dokąd usunąć. Wycinam albo za dużo, albo za mało. Mógłbyś wrzucić kawałek przykładowego tekstu, który usuwasz?

    Piszesz również, że „W sieci znaleźć można też kilka (dwa) darmowych rozwiań, które pozwalają na automatyczne wgranie plików TCX oraz ich naprawę. „.
    Możesz podpowiedzieć gdzie na coś takiego natrafiłeś, bo mi już ręce opadają od czytania w necie bzdur, ogólników, i dobrych rad domorosłych specjalistów, które po prostu nie działają….

        1. Dzięki.

          Ja zabrałem się do tego trochę bardziej asekuracyjnie, tzn. z tekstu ciurkiem lecącego w notatniku wycinam cały tekst zawarty w nawiasie , w którym występują słówka creator lub author. W sumie cztery cięcia ;)

          Czyli z tekstu:
          …… IntervalWorkout=”false”>BieganiePolar M43001631100Polar Flow Mobile Viewer Android00ENXXX-XXXXX-XX

          Tnę to:

          1. Witam. Dokładnie tak. A najgorsze, że nie potrafię tego edytować i zostawiam spaprany komentarz, a śmietnik pod tak pomocnym artykułem naprawdę nie przystoi.

            Jeszcze raz dziękuję za radę. Wczoraj udało mi się pokonać jakieś 60 plików, a pozostało jeszcze z ok. 500.
            Najgorsze nie jest to, że trzeba po benedyktyńsku dłubać w gąszczu literek, a to, że notatnik otwiera mi każdy plik ponad minutę, a nierzadko dłużej, a zamyka wcale nie krócej.
            Cóż, cierpliwości trening…

          2. Opcji, aby ułatwić sobie pracę masz kilka.

            1) w notepad++ lub dowolnym odpowiedniku wykorzystaj wyrażenia regularne albo XPath aby usunąć omawiane fragmenty. Obie opcje można zrobić na większej ilości plików i zostawić to w tle (opcja Search->Find in files…). Tutaj nawet nie trzeba wchodzić w jakieś zaawansowane wyrażenia bo wystarczy <Creator.*</Creator>

            2) Napisać w dowolnym języku program, który zrobi dokładnie to samo co opisałem wyżej.
            Dla przykłady w C# można to napisać np tak:
            var tcxFiles = Directory.GetFiles("c:\\Downloads", "*.tcx");
            foreach (var tcxFile in tcxFiles)
            {
            var fileContent = File.ReadAllText(tcxFile);
            fileContent = Regex.Replace(fileContent, @"<Creator.*</Creator>", string.Empty);
            fileContent = Regex.Replace(fileContent, @"<Author.*</Author>", string.Empty);
            string tcxFile = Path.Combine(Path.GetDirectoryName(tcxFile), "processed", Path.GetFileName(tcxFile));
            File.WriteAllText(tcxFile, fileContent);
            }

            Nie jest to optymalne rozwiązanie ale to najbardziej proste w zrozumieniu. Teraz wystarczy to u siebie skompilować i uruchomić.

            1. Witaj ponownie.
              Notepadem++ poszło o wiele sprawniej; dodawałem po 50 plików naraz i szkło gładko. Czyli 50 plików robiłem w tym samym czasie, w którym poprzednio robiłem jeden. Bajka.
              Teraz, gdy wszystko jest już przerzucone, muszę opanować jeszcze jedną przeszkodę, a mianowicie znaleźć sposób na to, żeby Garmin connect chciał te aktywności uwzględniać w statystykach. No, te wszystkie najszybsze kilometry, najdłuższe biegi, itp. Niestety, Garmin connect nadal widzi jedynie to, co połknął z zegarka.
              Czy Ty Krzysztofie znalazłeś na to sposób?

              1. Cześć Wojtku, Wcale nie musisz plików otwierać, wskaż katalog a N++ sam je znajdzie i poprawi wszystkie na raz.
                W N++ wypełnij pola Find what, replace with, Directory i zaznacz opcje Regular expression. jedni i potem drugie dla creatora.

                Do drugiego postaram się odnieść zmianą we wpisie bloga. Powinno się udać na weekend.

              2. W artykule dodałem informacje o tym, co powoduje aktualnie nieuwzględnianie zaimortowanych danych stosując się do pokazanego przeze mnie sposobu. Mam nadzieje, że to pomoże rozwiązać problem w Twoim przypadku :)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *