Autor Thema: Garmin Connect oder Endomondo  (Gelesen 1011 mal)

Offline eazy_isi

  • Jr. Member
  • **
  • Beiträge: 50
Garmin Connect oder Endomondo
« am: 25 Januar 2017, 06:31:13 »
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

  • Gast
Antw:Garmin Connect oder Endomondo
« Antwort #1 am: 14 Mai 2017, 17:32:06 »
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 :>

Offline amenomade

  • Hero Member
  • *****
  • Beiträge: 2579
Antw:Garmin Connect oder Endomondo
« Antwort #2 am: 14 Mai 2017, 17:55:25 »
Lässt sich das nicht mit HTTPMOD einbauen?

Gruß
FHEM 5.8 Pi 3, EchoDot, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, und HM Komponenten

F:"Schatz? Mach aus bitte"
M: "Alexa? Licht aus"-"Ich bin mir leider nicht sicher"  M:"Alexa? aus Licht"-"Das weiss ich leider nicht" M:"Alexa? Schalte...
F: "Drück mal auf den blöden Knopf!

Offline Wuehler

  • Developer
  • Full Member
  • ****
  • Beiträge: 349
Antw:Garmin Connect oder Endomondo
« Antwort #3 am: 05 August 2018, 23:47:44 »
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
« Letzte Änderung: 05 August 2018, 23:54:12 von Wuehler »
Gefällt mir Gefällt mir x 1 Liste anzeigen