Garmin Connect oder Endomondo

Begonnen von eazy_isi, 25 Januar 2017, 06:31:13

Vorheriges Thema - Nächstes Thema

eazy_isi

Hallo zusammen,

nachdem ich meine Whithings Waage erfolgreich angebunden habe.
Wäre es jetzt noch ganz interessant, die Daten aus Garmin Connect oder Endomondo integrieren zu können.
Hat sich daran schon jemand versucht ?

Grüße
Thomas

Andre0909

Hey, genau das intressiert mich auch. Habe eine Garminuhr und somit alle Daten wie Schritte, Sport, GPS-Daten dort. Leider habe ich keine Möglichkeit gefunden dies einzubinden. Würde sehr gerne z.B. ein Fussabdrucksymbol in Fhem Tablet UI integrieren mit den Tagesschritten.... Falls hier jemand mal "Lust" hat diesbezüglch was zu entwickeln ... wäre das ein Traum :>

amenomade

Lässt sich das nicht mit HTTPMOD einbauen?

Gruß
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Wuehler

#3
Da man sich nicht von garmin zu fitbit verbinden kann, also Freunde werden und sich gegenseitig challengen, habe ich mal angefangen einen Umweg über fhem zu bauen.

Für fitbit gibt es eine gute API und sogar schon ein Modul:
https://forum.fhem.de/index.php/topic,73285.45.html

Für garmin kostet der API-Key 5000$. So viel war es mir dann auch nicht Wert. Also der umständlichere Weg über die Webseite garmin-connect.
Und dann das Ganze nicht als Modul in fhem sondern außerhalb, da ich erstmal keine Lust habe mir FHEM zu blockieren. Vielleicht geht das Ganze auch mit HTTPMOD, aber da bin ich bisher noch nicht durchgestiegen.

Bisher ist erstmal nur die Abfrage der Schritte implementiert.
Man braucht:
1. einen dummy:
defmod dummy_garmin dummy
attr dummy_garmin event-on-change-reading Schritte,LastUpdate,doUpdate
attr dummy_garmin readingList Schritte LastUpdate doUpdate
attr dummy_garmin room fitness
attr dummy_garmin setList Schritte LastUpdate doUpdate
attr dummy_garmin stateFormat {ReadingsVal("dummy_garmin","Schritte","");;}

2. ein perl-Script:
Ein paar Variablem zu Beginn des Scriptes muss man anpassen!
# required:
# sudo apt-get install libcrypt-ssleay-perl
# sudo apt-get install libwww-mechanize-perl

use strict;
use warnings;
use POSIX;
use Modern::Perl;
use WWW::Mechanize;
use LWP::Simple;
use URI::Escape;
use JSON qw(decode_json);



my $fhem_ip="192.168.12.12";
my $fhem_port="8081";
# den display-name bekommt man aus der URL in garmin-connect, wenn man auf Aktivitäten->Schritte klickt
# der Wert nach "daily-summary"
my $owner_display_name="43f5a2jt-5v8d-4d16-aac0-02434f568ba6";
my $username="deine login-mailadresse";
my $password="dein passwort";
 
my $fhem_url="http://$fhem_ip:$fhem_port/fhem?cmd.dummy_garmin=set%20dummy_garmin%20";

my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
my $today=sprintf("%04d-%02d-%02d", $year+1900, $month+1, $mday);
 
garmin();

sub getCSRFToken{
  my $token="";
  my $content=get("http://$fhem_ip:$fhem_port/fhem");
  die "Couldn't get it!" unless defined $content;
  my $index1=index($content,"fwcsrf=");
  $index1+=8;
  my $index2=index($content,"'",$index1);
  $token=substr($content,$index1,$index2-($index1));
  print "fhem_csrf_token: ".$token."\n";
  return $token;
}

sub garmin{
# fhem-Dinge zuerst:
  my $token=getCSRFToken;
  get($fhem_url."doUpdate%20inProgress&fwcsrf=".$token);
 
  # -----------------------------------------------------------------------------
  # Loginseite aufrufen
  my $https_garmin_url="https://sso.garmin.com/sso/login?service=https%3A%2F%2Fconnect.garmin.com%2Fmodern%2F&webhost=https%3A%2F%2Fconnect.garmin.com&source=https%3A%2F%2Fconnect.garmin.com%2Fde-DE%2Fsignin&redirectAfterAccountLoginUrl=https%3A%2F%2Fconnect.garmin.com%2Fmodern%2F&redirectAfterAccountCreationUrl=https%3A%2F%2Fconnect.garmin.com%2Fmodern%2F&gauthHost=https%3A%2F%2Fsso.garmin.com%2Fsso&locale=de_DE&id=gauth-widget&cssUrl=https%3A%2F%2Fstatic.garmincdn.com%2Fcom.garmin.connect%2Fui%2Fcss%2Fgauth-custom-v1.2-min.css&privacyStatementUrl=%2F%2Fconnect.garmin.com%2Fde-DE%2Fprivacy%2F&clientId=GarminConnect&rememberMeShown=true&rememberMeChecked=false&createAccountShown=true&openCreateAccount=false&displayNameShown=false&consumeServiceTicket=false&initialFocus=true&embedWidget=false&generateExtraServiceTicket=false&generateNoServiceTicket=false&globalOptInShown=true&globalOptInChecked=false&mobile=false&connectLegalTerms=true&locationPromptShown=true";
  my ($mech) = WWW::Mechanize->new(autocheck => 0);
  $mech->cookie_jar(HTTP::Cookies->new());
  $mech->max_redirect(0);
 
  my $res=$mech->get($https_garmin_url);
  my $status = $mech->status();
  print "Loginseite aufrufen -> Status: $status \n";
  my$html_string = $res->decoded_content();
  #print $html_string;
 
 
  # -----------------------------------------------------------------------------
  # Login durchführen
  $res =$mech->submit_form(
        form_id => 'login-form',
        fields      => { username => $username , password => $password },
  );
  $status = $mech->status();
  print "Login durchführen -> Status: $status \n";
  $html_string = $res->decoded_content();
  #print $html_string;
 
 
  # -----------------------------------------------------------------------------
  # Login-Response an garmin senden
  my $reponse_url=substr($html_string,index($html_string,"var response_url"),300);
  $reponse_url=substr($reponse_url,index($reponse_url,"\"")+1);
  $reponse_url=substr($reponse_url,0,index($reponse_url,"\""));
  $reponse_url=~ s/\\\//\//g;
  print "reponse_url: $reponse_url\n";
  $https_garmin_url=$reponse_url;
  $res=$mech->get($https_garmin_url);
  $status = $mech->status();
  print "Login-Response an garmin senden -> Status: $status \n";
  $html_string = $res->decoded_content();
  #print $html_string;
 
 
  # -----------------------------------------------------------------------------
  # Schritte abfragen
  $https_garmin_url="https://connect.garmin.com/modern/daily-summary/$owner_display_name/$today/steps";
  $res=$mech->get($https_garmin_url);
  $status = $mech->status();
  print "Schritte abfragen -> Status: $status \n";
  $html_string = $res->decoded_content();
  #print $html_string;

  my $json=substr($html_string,index($html_string,"DAILY_SUMMARY = JSON.parse"));
  $json=substr($json,index($json,"\'")+1);
  $json=substr($json,0,index($json,"\'"));
  $json=~ s/\\//g;
  print "Json: $json\n";
  my $data=decode_json($json);
  my $schritte=$data->{steps};
  print "Steps: $schritte \n";
 
 
  # -----------------------------------------------------------------------------
  #Daten in FHEM aktualisieren:
  get($fhem_url."Schritte%20".uri_escape($schritte)."&fwcsrf=".$token);

  ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
  my $hms = sprintf("%02d.%02d.%04d %02d:%02d", $mday, $month+1, $year+1900, $hour, $min);
  get($fhem_url."LastUpdate%20".uri_escape($hms)."&fwcsrf=".$token);
 
  get($fhem_url."doUpdate%20done"."&fwcsrf=".$token);
  return;
}

3. in etc/crontab der regelmäßige Aufruf:
15,45 * * * * root    perl /mnt/development/perl/garmin.pm > /dev/null 2>&1

Gidiano

Zitat von: Wuehler am 05 August 2018, 23:47:44
...Für garmin kostet der API-Key 5000$....

Hallo zusammen,

weiß jemand, ob sich bei diesem Thema was getan hat?
Ich habe die Idee ein "genormtes" Wasserglas zu nutzen, um dann mit einem Knopfdruck mit einem physischen Schalter per fhem die getrunkene Wassermenge in meinem Garmin Connect Account zu dokumentieren.
Da jedes mal mit der app rumzufummeln kann es ja wohl nicht sein.

Viele Grüße
Christian
Grüße,
Christian