FLIPR - Récupération des données

Bonjour à tous.
Quelqu’un a-t-il déjà pu récupérer les infos d’un FLIPR sur un dashboard IPX800V4 ?
Il y a une API mais je bugge !
Merci pour toute info.

Bonjour AlexFisho,

il faudrait plutôt interroger le fabricant du produit… :wink:

Bonne journée

Bonjour,

je doute que le fabricant sache comment intégrer ses données dans une ipx :slight_smile:

@AlexFisho
avez-vous un lien vers la doc de l’API ?

@fgtoul Merci pour la réponse
Voici ce que j’ai : https://apis.goflipr.com
Et aussi : https://apis.goflipr.com/Help
Authentification
L’authentification n’est pas documentée dans la doc en ligne (https://apis.goflipr.com/Help)
Nous utilisons l’authentification par token OAuth2.
Récupération du token
Pour récupérer le token, il faut faire une requête POST en url encode sur
https://apis.goflipr.com/OAuth2/token
Les mots de passe et username sont les login / mdp de l’application smartphone.

Bonne soirée
Alexis

Bonjour à tous
Voici tout ce que j’ai trouvé. Je vais essayer de bidouiller, mais si un vrai développeur à un peu de temps à consacrer au sujet, je prends toute piste ou bout de code.
Merci et bonne journée.

DevGuide_FIPR_2018-1_2.pdf (138,7 Ko)

bonjour,
vous pouvez facilement récupérer les données dans Jeedom grâce à son plugin puis les envoyer régulièrement par script vers l’ipx800 V4 (grâce à son API V4)

Re bonjour
J’ai cherché mais à priori le plugin Jeedom n’est pas dispo pour mon DS218Play, ni Docker d’ailleurs.
Je continue mes recherches
Merci pour les pistes
Alexis

Bonjour,
Il y a toujours la solution d’un petit raspberry si non compatible avec le NAS.

Jeedom générant beaucoup de trafic de données vers le disque, la solution RPI + SSD est à préférer au NAS, même si les disques sont de série Noire ou Rouge et protégés par mirroring.
Surtout pas sur SD card.

En m’inspirant du code Netatmo posé sur mon NAS et en passant pas ChatGPT qui m’a corrigé mon code, j’ai des réponses PH, Température. Il me reste à interpréter la réponses JSON.
Voici mon code jusque là :

$token_url = "https://apis.goflipr.com/OAuth2/token";
$postdata = http_build_query(
        array(
            'grant_type' => "password",
           
            'username' => $username,
            'password' => $password
    )
);

$options = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);
$context  = stream_context_create($options);
$response = file_get_contents($token_url, false, $context);

$params = null;
$params = json_decode($response, true);

$api_url = "https://apis.goflipr.com/modules/F3730249/survey/last";
$options = array('http' => array(
    'method'  => 'GET',
    'header' => 'Authorization: Bearer ' . $params['access_token']
));
$context  = stream_context_create($options);
$response = file_get_contents($api_url, false, $context);

//$requete = file_get_contents($api_url);

//---Récupération des données JSON---------
//$url_devices = "https://apis.goflipr.com/modules/F3730249/survey/last";
$resultat_device = file_get_contents($response);

//décommentez les 2 lignes suivantes pour voir les données JSON renvoyées par l'API
echo $resultat_device;
exit();
2 « J'aime »

La réponse :

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   642    0   642    0     0    982      0 --:--:-- --:--:-- --:--:--   983
100   642    0   642    0     0    981      0 --:--:-- --:--:-- --:--:--   981

Warning: file_get_contents({"MeasureId":120,"Source":"Bluetooth","DateTime":"2023-05-24T16:11:20.5366488Z","Temperature":21.42,"PH":{"Label":"PH","Message":"Parfait","Deviation":0.4,"Value":7.36,"DeviationSector":"Medium"},"OxydoReductionPotentiel":{"Label":"Potentiel Redox.","Value":461.0},"Conductivity":{"Label":"Conductivité","Level":"--"},"UvIndex":0.0,"Battery":{"Label":"Batterie","Deviation":1.0},"Desinfectant":{"Label":"Chlore","Message":"Parfait","Deviation":0.061188062270932764,"Value":1.0185957815807192,"DeviationSector":"Medium"}}): Failed to open stream: File name too long in /volume1/web/Flipr/flipr2push.php on line 44

Bonjour
Modification du code avec retour des datas sans erreur :

//---Début procédure authentification---------------
$token_url = "https://apis.goflipr.com/OAuth2/token";
$postdata = http_build_query(
        array(
            'grant_type' => "password",
            'username' => $username,
            'password' => $password
    )
);

$options = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);
$context  = stream_context_create($options);
$response = file_get_contents($token_url, false, $context);

$params = null;
$params = json_decode($response, true);

$api_url = "https://apis.goflipr.com/modules/F3730249/survey/last";
$options = array('http' => array(
    'method'  => 'GET',
    'header' => 'Authorization: Bearer ' . $params['access_token']
));
$context  = stream_context_create($options);
$response = file_get_contents($api_url, false, $context);


$json_devices = json_decode($response,true);


// Initialisation de cURL
$ch = curl_init($api_url);

// Configuration des options de requête
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: Bearer ' . $params['access_token']
));

// Exécution de la requête et récupération du contenu
$response = curl_exec($ch);

// Fermeture de la connexion cURL
curl_close($ch);

// Traitement du contenu JSON
$data = json_decode($response, true);

// Faire le traitement nécessaire avec les données
// ...

echo $response;
exit();

bonjour @AlexFisho

c’est un script en quoi ? tu l’héberge comment sur ton nas ?

Moi je suis passé par un flow node-red pour récupérer des infos de capteurs sur une centrale Myfox via le même type d’API après il est possible de les injecter en mqtt sur v5 (mon cas) ou en push sur v4

il est possible depuis le PHP de décoder le json (voir exemple dans mon code du wiki sur Netatmo) et de pousser les valeurs vers des analogiques virtuelles, via l’api de l’ipx800 V4. Dans le wiki, j’ai proposé des exemples de code, par exemple celui-ci :
STATUS.XML et PHP — GCE Electronics (gce-electronics.com)

Mais le script PHP sur mon NAS bloque sur la ligne $ext_Temperature=$json_devices([« Temperature »])

Bonjour
Comment récupérer ce résultat de mon script PHP (sur le NAS) ?
Ce que me renvoi le script quand je consulte le résultat de l’exécution :
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed

0 0 0 0 0 0 0 0 --:–:-- --:–:-- --:–:-- 0
100 523 0 523 0 0 457 0 --:–:-- 0:00:01 --:–:-- 457
100 523 0 523 0 0 456 0 --:–:-- 0:00:01 --:–:-- 457
{« MeasureId »:152,« Source »:« Bluetooth »,« DateTime »:« 2023-05-26T08:01:32.8493169Z »,« Temperature »:20.34,« PH »:{« Label »:« PH »,« Message »:« Parfait »,« Deviation »:0.13,« Value »:7.25,« DeviationSector »:« Medium »},« OxydoReductionPotentiel »:{« Label »:« Potentiel Redox. »,« Value »:414.0},« Conductivity »:{« Label »:« Conductivité »,« Level »:« – »},« UvIndex »:0.0,« Battery »:{« Label »:« Batterie »,« Deviation »:1.0},« Desinfectant »:{« Label »:« Chlore »,« Message »:« Parfait »,« Deviation »:-0.19189021553178687,« Value »:0.67043208718036562,« DeviationSector »:« Medium »}}

Bonjour, ça y est la récupération des datas du FLIPR est envoyé sur mes VA et s’affichent bien dans STATUS.
Le code final à déposer sur un NAS (exécution toutes les heures pour moi) pour les possesseurs de FLIPR :

<?php
//renseignez vos identifiants ci-dessous
$password="****************";
$username="****************";
$IP_IPX800="192.168.XXX.XXX";
$API_key="apikey";
//---fin de paramétrage--
//---Début procédure d'authentification---------------
$token_url = "https://apis.goflipr.com/OAuth2/token";
$postdata = http_build_query(
    array(
        'grant_type' => "password",
        'username' => $username,
        'password' => $password
    )
);
$options = array(
    'http' => array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);
$context  = stream_context_create($options);
$response = file_get_contents($token_url, false, $context);
$params = json_decode($response, true);

$api_url = "https://apis.goflipr.com/modules/F3730249/survey/last";
$options = array(
    'http' => array(
        'method'  => 'GET',
        'header' => 'Authorization: Bearer ' . $params['access_token']
    )
);
$context  = stream_context_create($options);
$response = file_get_contents($api_url, false, $context);
$json_devices = json_decode($response, true);

// Traitement du contenu JSON
$data = json_decode($response, true);

// Faire le traitement nécessaire avec les données
// ...

// Vérification des erreurs éventuelles
if ($response === false) {
    // Gérer les erreurs de requête
} else {
    // Traitement du contenu JSON
    $data = json_decode($response, true);

    // Accéder aux données du JSON
    // ...

    // Faire le traitement nécessaire avec les données
    // ...
}

// Accéder aux valeurs spécifiques
$temperature = floatval($data["Temperature"]) * 100;

$ph = $data["PH"];
$phvalue = floatval($ph["Value"]) * 100;

If ($ph["Message"] == "Trop bas") {
    $phmessage = 1;
} elseif ($ph["Message"] == "Parfait") {
    $phmessage=2;
} elseif ($ph["Message"] == "Trop haut") {
    $phmessage=3;
} elseif ($ph["Message"] == "Bon") {
    $phmessage=4;
}

//$phmessage = $ph["Message"];

$clr = $data["Desinfectant"];
$clrvalue = floatval($clr["Value"]) * 1000;

If ($clr["Message"] == "Trop bas") {
    $clrmessage = 1;
} elseif ($clr["Message"] == "Parfait") {
    $clrmessage=2;
} elseif ($clr["Message"] == "Trop haut") {
    $clrmessage=3;
}


//$clrmessage = $clr["Message"];

//echo $temperature," ",$phvalue," ",$phmessage," ",$clrvalue," ",$clrmessage;
//exit();

$URL_Push="http://" . $IP_IPX800 . "/api/xdevices.json?key=" . $API_key . "&SetVA14=" . $temperature . "&SetVA15=" . $phvalue. "&SetVA16=" . $clrvalue ."&SetVA17=" . $phmessage ;

//-- Affichage de l'URL générée--------
echo $URL_Push . "<br>";

//----Envoi des données à l'API--------
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $URL_Push);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$data = curl_exec($ch);
curl_close($ch);


// -- Code Javascript pour récupérer la donéée texte sur l'IPX800V4 - Bloc HTML
// var ph = datasources["STATUS"]["response"]["analogV16"];
// var phmessage;
//if (ph == 1) {
//    phmessage = "Trop bas";
//} else if (ph == 2) {
//    phmessage = "Parfait";
//} else if (ph == 3) {
//    phmessage = "Trop haut";
//}
//return `
//<center>
//  <table width='90%' border="0">
//    <tr>
//       <td align="left" valign="middle" width="25%">${phmessage}</td>
//  </table>
//</center>`;

?>

@fgtoul Merci pour ton aide, j’ai mis le code fonctionnel en ligne.
Bon weekend

3 « J'aime »

Et sur l’IPX V 4 - Dans un bloc HTML :

var temp = (datasources["STATUS"]["response"]["analogV13"] * 1) / 100;
var chl = (datasources["STATUS"]["response"]["analogV15"] * 1) / 1000;
var chlmessage;
var valeur = (datasources["STATUS"]["response"]["analogV14"] * 1) / 100;
var ph = datasources["STATUS"]["response"]["analogV16"];
var phmessage;

if (chl >= 0.4 && chl <= 1.7) {
    chlmessage = "OK";
} else if (chl > 1.7) {
    chlmessage = "Trop haut";
} else if (chl < 0.4) {
    chlmessage = "Rajouter";
}

if (ph == 1) {
    phmessage = "Trop bas";
} else if (ph == 2) {
    phmessage = "Parfait";
} else if (ph == 3) {
    phmessage = "Trop haut";
} else if (ph == 4) {
    phmessage = "Bon";
}

return `
<br/>
<center>
  <table width='90%' border="0">
    <tr>
        <td align="left" valign="middle" style="margin-left: 20px; font-weight: bold; font-size: 1.2em;">Temp ${temp}°C</td>
    </tr>  
  </table>
  <br/>
  <table width='90%' border="0">
    <tr>
        <td align="left" valign="middle" style="margin-left: 20px; font-weight: bold; font-size: 1.2em;">PH ${valeur}</td>
        <td align="right" valign="middle" style="margin-right: 10px; font-weight: bold; font-size: 1.2em;">${phmessage}</td>
    </tr>  
  </table>
  <br/>
  <span style="float:left; margin-left: 20px; font-weight: bold; font-size: 1.2em;">Chlore ${chl}°C</span>
</center>`;

Et cela donne :
image

4 « J'aime »