Aller au contenu

Messages recommandés

Posté(e)

Xee-CES.jpg

 

Je n'ai pas vu de sujet concernant cet objet donc je vais faire une petite description.

 

Il s'agit d'un boîtier connecté pour voiture et qui se branche pour la plupart des modèles sur le port OBD2 de cette dernière, pour les autres il faut le faire installer par un professionnel.

 

Que fait donc ce boîtier ?

 

Ici la page de présentation sur le site officiel : http://www.xee.com/comment-ca-marche/

 

Ce boîtier rend les voitures compatibles connectées grâce à  la récupération des informations de diagnostic sur la prise OBD2 par laquelle il est aussi alimenté.

Il comprend pour plus d'informations une balise GPS, un accéléromètre ainsi qu'une carte SIM de l'opérateur Orange pour envoyer les données sur leurs serveurs. Le point intéressant est qu'il n'y a pas d'abonnement à  payer.

C'est comme ça que j'ai pu connecter ma vieille Laguna 2 de 2003, qu'aucun autre boîtier OBD2, même en bluetooth ne reconnaissait.

 

La fonctionnalité principale du boîtier est de savoir si notre véhicule roule et sa position.

De plus, suivant les modèles, il est possible de récupérer le niveau d'essence, si les feux sont restés allumés ou encore si la voiture n'est pas fermée.

 

Là  où ça devient encore plus intéressant, c'est qu'il y a une API pour récupérer les données et que l'on peut se créer un compte développeur afin de créer notre propre application.

Je me suis donc inscrit et je me suis créé une application de test pour récupérer mes données via un script PHP sur mon serveur.

Ma box récupère ensuite le JSON pour l'afficher dans un module virtuel.

 

Voici le lien pour s'inscrire en tant que développeur pour accéder à  l'API : https://dev.xee.com/

 

Il est possible de récupérer les informations concernant l'utilisateur, la voiture et son status et l'historique des trajets.

 

MAJ du 18/05/2016 : Ajout en pièce jointe du module virtuel de test pour Fibaro HC2.

Je laisse l'url de test afin que vous puissiez voir le rendu et le contenu du JSON.

Attention, le contenu du fichier JSON de test est compilé à  partir de plusieurs requêtes effectuées sur l'API.

Je vous prépare pour bientôt un exemple de fichier PHP à  mettre sur un serveur.

Il me reste un point bloquant qui est l'identification obligatoire par le site de Xee.

 

 

MAJ du 23/05/2016 : nouvelle version du module virtuel V1 pour Fibaro HC2 avec 2 icônes, le script PHP à  mettre sur votre serveur et un mini tuto pour faire votre application sur le site de Xee.

 

Prérequis pour pouvoir récupérer des données de l'API, l'inscription sur le site de développement de Xee : https://dev.xee.com/

NB : je pense que l'on peut utiliser son compte Xee pour se connecter à  Xee dev, à  vérifier.

 

Une fois l'inscription réalisée, il faut créer une nouvelle application comme suit :

 

post-2186-0-05610900-1464037011_thumb.png

 

Vous obtiendrez alors un client ID et un secret ID qu'il faut précieusement garder sinon il faudra refaire une nouvelle application.

Ces IDs vous seront utile pour faire fonctionner le script PHP.

 

Script PHP pour faire l'interface entre l'API de Xee et la box domotique (à  installer sur un serveur web accessible depuis la HC2) :

 

1. Remplacer les données dans les constantes en haut du fichier par celles que vous avez renseignées lors de la création de votre application et celles que vous avez obtenues :

XEE_API_CLIENT_ID, XEE_API_SECRET_ID et XEE_API_REDIRECT_URI.

2. Déposer le fichier sur votre serveur à  l'emplacement XEE_API_REDIRECT_URI.

3. Aller sur la page via un navigateur. Vous devez arriver sur une page de connexion où il faut renseigner vos identifiants Xee.

4. Récupérer le refresh_token dans le code JSON retourné et l'ajouter dans le module de la HC2. (variable defaultToken).

<?php

define('XEE_API_CLIENT_ID', 'votreclientid');
define('XEE_API_SECRET_ID', 'votresecretid');
define('XEE_API_REDIRECT_URI', 'http://votre-serveur.com/le/chemin/de/votre/script/php');

define('XEE_API_DEFAULT_URL', 'https://cloud.xee.com/v3/');

/**
 * get data from the web service
 * @return array agreggation from all results
 */
function getData()
{
    $totalResults              = array();
    $totalResults['token']     = getAccessToken();
    $totalResults['user']      = getUserData($totalResults['token']['access_token']);
    $totalResults['car']       = getCarData($totalResults['token']['access_token'], $totalResults['user']['id']);
    $totalResults['carStatus'] = getCarStatusData($totalResults['token']['access_token'], $totalResults['car']['id']);

    return $totalResults;
}

/**
 * get connected user data
 * @param  string $accessToken access token
 * 
 * @return array all informations about me
 */
function getUserData($accessToken)
{
    return getRequest(
        XEE_API_DEFAULT_URL . 'users/me', 
        $httpHeaders = array(
            'authorization: Bearer ' . $accessToken,
            'cache-control: no-cache'
        )
    );
}

/**
 * get user's car data
 * @param  string $accessToken access token
 * @param  int    $userId      car's owner
 * 
 * @return array all informations about the first car
 */
function getCarData($accessToken, $userId)
{
    $carData = getRequest(
        XEE_API_DEFAULT_URL . 'users/' . $userId . '/cars', 
        $httpHeaders = array(
            'authorization: Bearer ' . $accessToken,
            'cache-control: no-cache'
        )
    );
    //get only the first car
    return $carData[0];
}

/**
 * get car status
 * @param  string $accessToken access token
 * @param  int    $carId       car id
 * 
 * @return array all informations about car status
 */
function getCarStatusData($accessToken, $carId)
{
    $carStatusData = getRequest(
        XEE_API_DEFAULT_URL . 'cars/' . $carId . '/status', 
        $httpHeaders = array(
            'authorization: Bearer ' . $accessToken,
            'cache-control: no-cache'
        )
    );

    return $carStatusData;
}

/**
 * automatic switch to get the first token from first connection
 * or to get a fresh token from the web service
 * @return array access token, refresh token and expiration date
 */
function getAccessToken()
{
    if (isset($_GET['token']) && !empty($_GET['token'])) {
        return getFreshToken($_GET['token']);
    } elseif (isset($_GET['code']) && !empty($_GET['code'])) {
        return getToken($_GET['code']);
    }

    firstConnection();
}

/**
 * get an access token and a new refresh token from a refresh token
 * @param  string $refreshToken current refresh token
 * @return array access token, refresh token and expiration date 
 */
function getFreshToken($refreshToken)
{
    return getToken($refreshToken, 'refresh_token');
}

/**
 * generic function to get a token
 * @param  string $key  authorization code or refresh token
 * @param  string $type grant type 
 * 
 * @return array access token, refresh token and expiration date
 */
function getToken($key, $type = '')
{
    switch ($type) {
        case 'refresh_token':
            $parameters = 'grant_type=refresh_token&refresh_token=' . $key;
            break;
        
        default:
            $parameters = 'grant_type=authorization_code&code=' . $key;
            break;
    }

    return postRequest(
        XEE_API_DEFAULT_URL . 'auth/access_token', 
        $parameters, 
        $httpHeaders = array(
            'authorization: Basic ' . base64_encode(XEE_API_CLIENT_ID . ':' . XEE_API_SECRET_ID),
            'cache-control: no-cache',
            'content-type: application/x-www-form-urlencoded'
        )
    );
}

/**
 * first Connection to the webservice with an Oauth authentification
 */
function firstConnection()
{
    $urlParams = array(
        'client_id'    => XEE_API_CLIENT_ID,
        'scope'        => 'users_read cars_read trips_read signals_read locations_read status_read',
        'redirect_uri' => XEE_API_REDIRECT_URI
    );

    header('Location: ' . XEE_API_DEFAULT_URL . 'auth/auth?' . http_build_query($urlParams));
    die;
}

/**
 * do a request with POST method
 * @param  string $url         url do do the request
 * @param  string $postFields  keys/values to POST
 * @param  array  $httpHeaders additionnal HTTP headers
 * 
 * @return array json decoded request result
 */
function postRequest($url, $postFields, $httpHeaders = array())
{
    return sendRequest($url, $requestType = 'POST', $postFields, $httpHeaders);
}

/**
 * do a request with GET method
 * @param  string $url         url do do the request
 * @param  array  $httpHeaders additionnal HTTP headers
 * 
 * @return array json decoded request result 
 */
function getRequest($url, $httpHeaders = array())
{
    return sendRequest($url, $requestType = 'GET', $postFields = '', $httpHeaders);
}

/**
 * generic function to make curl request
 * @param  string $url         url do do the request
 * @param  string $requestType request type : GET or POST
 * @param  string $postFields  keys/values urlencoded for POST method
 * @param  array  $httpHeaders additionnal HTTP headers
 * 
 * @return array json decoded request result
 */
function sendRequest($url, $requestType = 'GET', $postFields = '', $httpHeaders = array())
{
    $curl = curl_init();

    curl_setopt_array($curl, 
        array(
            CURLOPT_URL            => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING       => '',
            CURLOPT_MAXREDIRS      => 10,
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST  => $requestType,
            CURLOPT_POSTFIELDS     => $postFields,
            CURLOPT_HTTPHEADER     => $httpHeaders,
        )
    );

    $response = curl_exec($curl);
    $err      = curl_error($curl);

    curl_close($curl);

    if ($err) {
      die('cURL Error #:' . $err);
    } else {
        return json_decode($response, true);
    }
}

// display json encoded data
echo json_encode(getData());
exit;

Et enfin, installation du module :

 

 

1. Importer le module

2. Ajouter les 2 icônes, vert pour l'icône par défaut et rouge pour l'icône en erreur

3. Modifier les paramètres du module :

Voici les paramètres à  modifier dans le module pour que celui-ci récupère les données :

local host              = 'votre-serveur.com';
local path              = '/chemin/ou/se/trouve/le/fichier/php';
local defaultToken = 'token a récupérer lors de la première connexion au script PHP dans un navigateur';
local iconNok        = numéro de l’icône quand le script est déconnecté de l'API, soit xee_fail.png;

 

4. Enjoy !

 

 

gallery_2_27_6051.png

 

XeeConnect.vfib

 

post-2186-0-70844900-1464036159_thumb.png

 

post-2186-0-23035200-1464036160_thumb.png

  • Upvote 8
Posté(e)

Tu l'as pris où ? Chez norauto avec le code 2903214001017, je l'ai eu à  119 euros en retrait en magasin.

Posté(e)

Non je ne l'ai pas trouvé en Belgique donc bêtement sur Amazon.fr mais à  139

Tu pourras tester le plugin qui va avec  ;)

Posté(e)

Je serais très intéressé par ton module virtuel, afin de voir ce qu'on peut en tirer.

Si ça fonctionne bien, ça pourrait m'intéresser. Le seul truc qui me fait craindre avec ce genre d'objet, c'est comme d'habitude, le cloud. Ca va fonctionner pendant 2 ans, et puis pouf, 130€ àla poubelle :(

  • Upvote 1
Posté(e)

J'ai l'ancienne version et j'en suis super content aussi ;) par contre j'ai pas bidouillé avec l'api du coup je suis intéressé de voir le vd ;)

Posté(e)

Ah Ludo, il me semblait bien avoir vu que tu as un Xee aussi. C'est bête on a oublié d'en parler hier, c'est passé trop vite :D

  • Upvote 1
Posté(e)

Excellent Christophe ;) oui on a arrêter à1 h on aurait dû pousser encore un peu ;) mais t'inquiète j'ai toujours la led qui clignote ;) Et tu es le bienvenue :)

  • Upvote 1
Posté(e)

Premier post mis àjour avec le script PHP V1, le module V1 et un tuto rapide pour créer l'application sur le site de Xee dev.

Les remarques sont les bienvenues, surtout si j'ai zappé un truc.

  • Upvote 1
Posté(e)

Génial :D

 

Tu arrives à  récupérer la localisation GPS de la voiture ? Parce qu'en utilisation domotique ça serait terrible !

Posté(e)

Je n'ai pas étudié le fonctionnement du retour du status de la voiture en temps réel (avec décalage des serveurs).

 

Mais oui, il y a la position de la voiture :

"location":{"latitude":56.701694,"longitude":12.1796002,"altitude":1.6,"heading":123.45,"satellites":6,"date":"1970-01-12T04:28:27.461Z"}

 

Dans mon module, j'utilise une fonction pour récupérer la distance entre la HC2 et la voiture par leurs coordonnées GPS.

 

On pourrait tester si la voiture s'éloigne ou se rapproche, si elle entre dans un périmètre...

Posté(e)

tu parles de temps réel versus le périmètre. Donc tu pense qu'il y a un décalage temporel ? De quel ordre (secondes, minutes, plus ?). Dans le même genre, quel est l'intervalle de relevé de la position ?

Ca fait beaucoup de questions pointues, mais je trouve que la localisation GPS est la principale utilité de ce module dans notre cadre domotique.

Posté(e)

Je ne sais pas à  quelle fréquence les données remontent à  l'API mais je sais que le boîtier enregistre très précisément le trajet, les kilomètres faits et le temps mis.

L'inconnue à  tester est de savoir si ce que l'on récupère de l'API est actualisé souvent et si le temps mis entre la remontée d'infos sur les serveurs et l'accès via l'API est assez rapide.

 

J'ai un doute car les notifications de l'application officielle que ma voiture est en déplacement arrivent avec un certain délais variable.

 

A tester plus en profondeur maintenant que j'ai mon module, je vais essayer d'enregistrer les données qui arrivent sur la HC2 sur emoncms pour voir la fréquence d'actualisation.

  • Upvote 1
Posté(e)

Euh... @Lazer... @gomba777 est passé sous Jeedom et j'évoquais le plugin disponible pour ce système  ;)

 

Plugin testé mais sous Jeedom un petit attach et après j’arrête de polluer le forum Fibaro avec du Jeedom :-)

 

post-741-0-11268800-1464079343_thumb.jpg

 

On récupère bien les donnée de géoloc en temps réel quand la voiture roule et il y a un widget qui permet d'afficher la position sur une carte google. On peut aussi bien entendu déclencher des scénarios en fonction de la localisation.

 

Par contre je suis un peu déçu par le nombre d'infos remontée. A part les données de géolocalisation (c'est déjà  génial), la tension de la batterie, et les données de l'accéléromètre on ne trouve pas grand chose d'autre. Je pensais que j'allais obtenir plein d'infos sur les données moteur, la vitesse maximum, les derniers messages (entretien, pannes), etc... mais ça ne semble pas être le cas.

Peut être que Volvo ne propose pas ces données?! Chez moi dans Marque: et Modèle: il met 'generic'...

Posté(e)

Bon, j'ai du mal àavoir une connexion stable au web service :/

Je n'ai pas l'habitude de travailler avec des authentification Oauth.

  • 2 semaines après...
×
×
  • Créer...