Jeedom et Garmin Connect

Bonjour à tous,
Je dispose d’une montre Garmin et d’un espace Garmin Connect.
J’ai également une balance connectée dont les données remontent directement à Jeedom via le plugin Blea.

Mon souhait envoyer les données de ma balance récupérées via Jeedom vers Garmin Connect.
Il y a des projets sur le net mais je ne sais pas comment les mettre en place via un scénario sous Jeedom.

Merci par avance.
Mathieu

Tu utilises quoi comme balance connecté ? elle a une application dédié ?

Hello,
C’est une Xiaomi, et on peut passer par une application.
Je veux éviter pour ne pas être dépendant d’une application sur un smartphone connecté au moment de la relevé.

Mathieu

Ok, donc sans passer pr l’application propriétaire, je vais laisser les autres jouer.

Sinon :

Garmin → Google fit
MiFit → Google fit

Google fit → Jeemate :grin:

Hello,
En fait je veux plutôt que l’information soit renseignée par jeedom dans Garmin.
Ce schéma fonctionne ?
MiFit => Google Fit => Jeedom
Google Fit => Garmin

Mathieu

Alors pourquoi s’embêter a passer dans jeedom, tu saute une étape et tu fais

Mifit → Google fit → Garmin

Regarde l’application health sync sur le play store.

A moins que MiFit soit compatible avec l’application health connect de Google et là tu importe dans heath connect tes données MiFit et garmin vient les lire.

Que jeedom récupère les données ok mais s’embêter a trouvé une solution pour les écrire chez Garmin… Cela doit exister.

Je vois que zeplife permet le transfert vers Google mais pas mifitness.

Je vais étudier la chose.
Après quand je me pèse, je reçois tout par SMS, géré par Jeedom.

Hello @sagitaz,
J’ai regardé un peu les solutions, et malheureusement, je souhaite garder la gestion et l’historisation dans Jeedom.
Du coup, je recherche toujours activement comment envoyer des infos de Jeedom vers Garmin Connect :slight_smile:

J’ai trouvé ça : GitHub - cyberjunky/home-assistant-garmin_connect: The Garmin Connect integration allows you to expose data from Garmin Connect to Home Assistant.

Mathieu

il y a aussi ce site : https://web-body-composition.vercel.app/
donc cela doit être possible :slight_smile: mais complétement en dehors de mes compétences.

J’ai tenté cela dans un bloc code:

$arrCredentials = array(
   'username' => 'XXXXXXXXXXXXXXXXXXXXX',
   'password' => 'XXXXXXXXXXXXXXXXXXXXX',
);
$url = "/var/www/html/dawguk/GarminConnect";
try {
   $objGarminConnect = new $url.($arrCredentials);

   $objResults = $objGarminConnect->getActivityList(0, 1, 'cycling');
   foreach($objResults->results->activities as $objActivity) {
      print_r($objActivity->activity);
     $scenario->setLog('objActivity: ' .$objActivity);
   }

} catch (Exception $objException) {
   echo "Oops: " . $objException->getMessage();
  $scenario->setLog('oops: ' .$objException);
}

mais il ne trouve pas le dossier, alors que:
image

Bonjour à tous,
J’ai bien avancé !
Voici le détail de ce que j’ai fait et qui fonctionne.
Je ne suis pas développeur, donc si vous vous sentez capable et surtout si vous avez l’envie d’en faire un plugin, n’hésitez pas.
Je me ferais un plaisir de vous aider dans la limite de mes compétences :smiley:

Voici les manipulations :
Attention, je ne peux être tenu responsable si vous cassez votre Jeedom :wink:

1/ Mettre le contenu de l’archive (dans mon cas linux-arm.tar.gz) que vous trouvez ici Release CLI v.0.0.2 · lswiderski/yet-another-garmin-connect-client · GitHub et le mettre dans un dossier de /var/www/html/plugins/script/data/ en créant un nouveau dossier (dans mon cas yet-another-garmin-connect-client).

2/ Mettre les droits via SSH :
Se rendre dans le dossier créé ci-dessus et taper sudo chmod +X YAGCC

3/ Utiliser un bloc code dans un scénario pour passer la commande suivante :

$retour = shell_exec('/var/www/html/plugins/script/data/yet-another-garmin-connect-client/YAGCC uploadbodycomposition --weight XX --bmi XX --bone-mass XX --fat XX --hydration XX --muscle-mass XX --visceral-fat XX --email XX@XX.fr --password XX');
$scenario->setLog('Retour: ' .$retour);

Voici les arguments de la ligne de commande :

  -b, --bone float              Set your bone mass in percent
      --bone-mass float         Set your bone mass in kilograms (use --bone or --bone-mass)
  -c, --calories float          Set your caloric intake
  -e, --email string            Email of the Garmin account
  -f, --fat float               Set your fat in percent
  -h, --help                    help for upload
      --hydration float         Set your hydration in percent
      --metabolic-age float     Set your metabolic age
  -m, --muscle float            Set your muscle mass in percent
      --muscle-mass float       Set your muscle mass in kilograms (use -muscle or --muscle-mass)
  -p, --password string         Password of the Garmin account
      --physique-rating float   Set your physique rating (valid values: 1-9)
  -t, --unix-timestamp int      Set the timestamp of the measurement (default -1)
      --visceral-fat float      Set your visceral fat rating (valid values: 1-60)
  -w, --weight float            Set your weight in kilograms (default -1)

2 données sont à calculer pour compléter le rapport vers garmin :
metabolic-age qui est le calcul suivant :
Pour un homme :
(Taille * -0.7471) + (Poids * 0.9161) + (Age * 0.4184) + (Impedance * 0.0517) + 54.2267

Pour une femme :
(Taille * -1.1165) + (Poids * 1.5784) + (Age * 0.4615) + (Impedance * 0.0415) + 83.2548
==> Aucun problème pour le calculer dans le scénraio

physique-rating :
Et là le calcul me semble plus compliqué à transposer en php (je n’y suis pas arrivé).
C’est la fonction GetFatPercentageScale() qu’on trouve ici : https://github.com/lswiderski/MiScaleBodyComposition/blob/main/src/MiScale.cs#L541

Mathieu

Et voilà, le code est surement très moche, mais j’arrive à calculer le physique-rating:

// calcul de la constitution physique
$yourInstance = new YourClassName();
$yourInstance->sex = $sex;
$yourInstance->age = $age;
$yourInstance->height = $muscle;
$yourInstance->fat = $fat;
$yourInstance->muscle = $muscle;
$getFatPercentageScale = $yourInstance->getFatPercentageScale();
$getMuscleMassScale = $yourInstance->getMuscleMassScale();
$getBodyType = $yourInstance->getBodyType();
$factorValue = $yourInstance->getBodyType();

class FatPercentageScale {
    public $Min;
    public $Max;
    public $Female;
    public $Male;
}

class MuscleMassScale {
    public $Min;
    public $Female;
    public $Male;
}

class YourClassName {
    public $fatPercentageScales = array(
        array("Min" => 0, "Max" => 12, "Female" => array(12, 21, 30, 34), "Male" => array(7, 16, 25, 30)),
        array("Min" => 12, "Max" => 14, "Female" => array(15.0, 24.0, 33.0, 37.0), "Male" => array(7.0, 16.0, 25.0, 30.0)),
        array("Min" => 14, "Max" => 16, "Female" => array(18.0, 27.0, 36.0, 40.0), "Male" => array(7.0, 16.0, 25.0, 30.0)),
        array("Min" => 16, "Max" => 18, "Female" => array(20.0, 28.0, 37.0, 41.0), "Male" => array(7.0, 16.0, 25.0, 30.0)),
        array("Min" => 18, "Max" => 40, "Female" => array(21.0, 28.0, 35.0, 40.0), "Male" => array(11.0, 17.0, 22.0, 27.0)),
        array("Min" => 40, "Max" => 60, "Female" => array(22.0, 29.0, 36.0, 41.0), "Male" => array(12.0, 18.0, 23.0, 28.0)),
        array("Min" => 60, "Max" => 100, "Female" => array(23.0, 30.0, 37.0, 42.0), "Male" => array(14.0, 20.0, 25.0, 30.0))
    );
  
    public $muscleMassScale = array(
        array(
        "Min" => array("Male" => 170, "Female" => 160),
        "Female" => array(36.5, 42.6),
        "Male" => array(49.4, 59.5),
        ),
        array(
        "Min" => array("Male" => 160, "Female" => 150),
        "Female" => array(32.9, 37.6),
        "Male" => array(44.0, 52.5),
        ),
        array(
        "Min" => array("Male" => 0, "Female" => 0),
        "Female" => array(29.1, 34.8),
        "Male" => array(38.5, 46.6),
    ),
    );

    public $sex;
    public $age;
    public $fat;
    public $muscle;
    public $factor;

    public function getFatPercentageScale() {
        foreach ($this->fatPercentageScales as $scale) {
            if ($this->age >= $scale["Min"] && $this->age < $scale["Max"]) {
                switch ($this->sex) {
                    case "Female":
                        return $scale["Female"];
                    case "Male":
                        return $scale["Male"];
                    default:
                        throw new Exception("NotImplementedException");
                }
            }
        }

        throw new Exception("Scale not found for the given age and sex.");
    }
  
public function getMuscleMassScale() {
        foreach ($this->muscleMassScale as $scale) {
        if ($this->height >= $scale["Min"][$this->sex]) {
            switch ($this->sex) {
                case "Female":
                    return $scale["Female"];
                case "Male":
                    return $scale["Male"];
                default:
                    throw new Exception("NotImplementedException");
            }
        }
    }

    throw new Exception("Scale not found for the given height and sex.");
}

public function getBodyType() {
    $factor = 0;
    if ($this->fat > $this->getFatPercentageScale()[2]) {
        $factor = 0;
    } elseif ($this->fat < $this->getFatPercentageScale()[1]) {
        $factor = 2;
    } else {
        $factor = 1;
    }
    $muscleScale = $this->getMuscleMassScale();
    if ($this->muscle > $muscleScale["Male"][1]) {
        return 2 + ($factor * 3);
    } elseif ($this->muscle < $muscleScale["Male"][0]) {
        return ($factor * 3);
    } else {
        return 1 + ($factor * 3);
    }
}
}