Nouvelle Twingo ZE

Bonjour à tous,
Je viens de réceptionner ma nouvelle twingo ZE et je me suis empressé d’installer le plugin jeedom pour la piloter.
Tout marche globalement bien mais je pense que les json de réponse de cette nouvelle twingo sont un peu différent des autres…je m’explique … :slight_smile:

Le json de réponse du endpoint battery-status est le suivant :

{"data":{"type":"Car","id":"VF1AH000669300478","attributes":{"timestamp":"2022-06-21T06:37:36Z","batteryLevel":100,"batteryTemperature":20,"batteryAutonomy":182,"batteryCapacity":0,"batteryAvailableEnergy":22,"plugStatus":0,"chargingStatus":-1.1,"chargingRemainingTime":-1,"chargingInstantaneousPower":0}}}

Ce qui différe c’est l’attribut pour récupérer la date de MAJ … ici timestamp and dans le code du plugin il est attendu lastUpdateTime.
Le soucis est que sur la Twingo ou général dû à une évolution de l’api renault ?
Pour corriger le soucis j’ai ajouté ces lignes dans la fonction updateBattery

	  
	  if(isset($json['data']['attributes']['timestamp'])) {
		$time = new DateTime($json['data']['attributes']['timestamp']);
		$time->add(new DateInterval('PT' . '120' . 'M'));
		$stamp=$time->format('Y-m-d H:i');
		$ze->checkAndUpdateCmd('lastUpdate', $stamp);
      }

Le json de réponse du endpoint hvac-status est un peu différent également sur la partie récupération de la température … dans le plugin il s’agit de l’attribut externalTemperature alors que chez moi je n’ai pas cet attribut mais l’attribut internalTemperature
Le soucis est que sur la Twingo ou général dû à une évolution de l’api renault ?
Pour corriger le soucis j’ai ajouté ces lignes dans la fonction updateHvac

if(isset($json['data']['attributes']['internalTemperature'])) {
        $temp = $json['data']['attributes']['internalTemperature'];
        $ze->checkAndUpdateCmd('temp', $temp);
      }

Par contre cette info de température ne se met à jour que si on met la clim en route sinon cette valeur ne change pas … pareil chez vous ?

Chez moi l’arrêt de la clim ne fonctionne pas … cette fonction est elle opérationnelle chez vous ?
D’ailleurs je pense qu’il manque une MAJ du status de la clim lors d’une action sur celle-ci (sinon la maj se fait avec le cron 5 minutes apres … :-()
Je ne sais pas si le retour de l’appel du enpoint hvac-star est suffisant pour mettre a jour la commande hvacStatus … pour le moment je force un appel au endpoint hvac-status après l’execution d’une action on ou off de la clim

ze::updateHvac($VIN);

Dernière petite question sur la température de préconditionnement de la clim

Celle-ci est elle prise en charge ? Si oui ne serait il pas interessant de rajouter une commande de type curseur pour gérer cette donnée de manière dynamique ?

En attendant je vais potasser la doc api de renault pour voir si il est possible de faire d’autres choses … :slight_smile:

@chris94440

Bonjour chris94440

1°) Je suis propriétaire d’une Twigo ZE, et débutant en programmation Jeedom.
Peux tu me dire où trouver les fichiers (chemin via l’éditeur de fichier) et le code que tu as modifiés ?

2°) Concernant la fonction geoloc : ces données sont elles dispo dans l’API Renault pour la Twigo ZE ?
(en tout cas, le plugin ne remonte rien pour « latitude » et « longitude »)
PS : aujourd’hui je me sert d’un tag Nut Find3 Smart Tracker pour détecter la voiture et mettre la borne de recharge électrique (easyWallbox) sous tension.

Merci

Hello
Je te fais cela dès que j’ai un ordinateur sous la main
@chris94440

Hello
Alors il faut aller dans plugins
image

Puis dans ze/core/class/ze.class.php

Dans la fonction updateBattery tu ajoute

if(isset($json['data']['attributes']['timestamp'])) {
		$time = new DateTime($json['data']['attributes']['timestamp']);
		$time->add(new DateInterval('PT' . '120' . 'M'));
		$stamp=$time->format('Y-m-d H:i');
		$ze

Dans la fonction updateHvac tu ajoutes

if(isset($json['data']['attributes']['internalTemperature'])) {
        $temp = $json['data']['attributes']['internalTemperature'];
        $ze->checkAndUpdateCmd('temp', $temp);
      }

et normalement apres le passage du cron tu devrais avoir ces valeurs

Concernant les données de latitude et de longitude elle remontent bien chez moi
@chris94440

@chris94440

Je viens de voir ce topic, j’essaie de te répondre dans l’ordre :

Concernant le timestamp, effectivement à priori l’api a bougé sur ce point. Je vais intégrer le fix directement dans la prochaine version.

Concernant la différence sur les internal / externalTemperature, à priori ce serait spécifique à la twingo. Je peux cependant rajouter le paramètre sans souci. De cette manière, vous aurez juste à l’activer à la détection de votre véhicule et pas besoin de modifier le code du plugin.

Pour le statut de la Clim, il a été implémenté car l’API était dispo, mais cela n’a jamais fonctionné (sur ma vieille Zoé en tout cas) . Si c’est fonctionnel sur certains véhicules, on peut effectivement affiner sur ce point, sachant tout de même que les remontées des commandes dans l’API peuvent parfois prendre plusieurs minutes.

Pour la température de clim, le paramètre existait dans l’API et je l’ai donc ajouté dans le plugin pour pouvoir tester sur les nouveaux véhicules. Pour l’instant je n’ai encore vu aucun véhicule le supporter vraiment.

@anto35 merci pour ton retour et tes prises en charges.
En effet j’ai l’impression qu’en fonction des véhicules l’api ne répond pas de la même manière …cela ne semble pas tres abouti côté renault… :slight_smile:
Je joue un peu avec les différents endpoints pour voir ce qu’elles informations on pourrait récupérer … :slight_smile:
Avec ce pti scenario on peut tester les endpoints à la volée …

ze::login();
foreach (eqLogic::byType('ze', true) as $vehicle) {
  	$scenario->setLog('kamereonrooturl : ' . config::byKey('kamereonrooturl', 'ze'));
  	$VIN=$vehicle->getLogicalId();
	$end= date_create('now')->format('Ymd');
  
  	//$url=config::byKey('kamereonrooturl', 'ze') . "/commerce/v1/accounts/" . config::byKey('kamereonaccountid', 'ze') . "/kamereon/kca/car-adapter/v1/cars/" . $VIN . "/charge-history?country=FR&start=202205&end=202206&type=month";
	$url=config::byKey('kamereonrooturl', 'ze') . "/commerce/v1/accounts/" . config::byKey('kamereonaccountid', 'ze') . "/kamereon/kca/car-adapter/v1/cars/" . $VIN . "/charge-history?country=FR&start=20220101&end=".$end."&type=day";
  	//chargeHistroy
  	callAPIGet($scenario, $url,'charge-history','GET',null);
  
  	//getCharges
  	$url=config::byKey('kamereonrooturl', 'ze','GET',null) . "/commerce/v1/accounts/" . config::byKey('kamereonaccountid', 'ze') . "/kamereon/kca/car-adapter/v1/cars/" . $VIN . "/charges?country=FR&start=20220101&end=".$end;
	callAPIGet($scenario, $url,'charges','GET',null);
  
  	//hvac sessions
  	$url=config::byKey('kamereonrooturl', 'ze') . "/commerce/v1/accounts/" . config::byKey('kamereonaccountid', 'ze') . "/kamereon/kca/car-adapter/v1/cars/" . $VIN . "/hvac-sessions?country=FR&start=20220101&end=".$end;
	callAPIGet($scenario, $url,'hvac-sessions','GET',null);
  
  	//hvac settings
  	$url=config::byKey('kamereonrooturl', 'ze') . "/commerce/v1/accounts/" . config::byKey('kamereonaccountid', 'ze') . "/kamereon/kca/car-adapter/v1/cars/" . $VIN . "/hvac-settings?country=FR";
  	callAPIGet($scenario, $url,'hvac-settings','GET',null);
  
  	
  	
  	//lock-status
  	$url=config::byKey('kamereonrooturl', 'ze') . "/commerce/v1/accounts/" . config::byKey('kamereonaccountid', 'ze') . "/kamereon/kca/car-adapter/v1/cars/" . $VIN . "/lock-status?country=FR";
    callAPIGet($scenario, $url,'lock-status','GET',null);
  
  	
  	//refresh hvc-status
  	$url=config::byKey('kamereonrooturl', 'ze') . "/commerce/v1/accounts/" . config::byKey('kamereonaccountid', 'ze') . "/kamereon/kca/car-adapter/v1/cars/" . $VIN . "/actions/refresh-hvac-status?country=FR";
  	$params = array( 'data' =>  array(  'type' => 'RefreshHvacStatus'));
  	callAPIGet($scenario, $url,'refresh-hvac-status','POST',$params);
  
  	//update hvac-status
  	$url=config::byKey('kamereonrooturl', 'ze') . "/commerce/v1/accounts/" . config::byKey('kamereonaccountid', 'ze') . "/kamereon/kca/car-adapter/v1/cars/" . $VIN . "/hvac-status?country=FR&start=20220101&end=".$end;
  	callAPIGet($scenario, $url,'hvac-status','GET',null);
  
  	//battery-status
  	$url=config::byKey('kamereonrooturl', 'ze') . "/commerce/v1/accounts/" . config::byKey('kamereonaccountid', 'ze') . "/kamereon/kca/car-adapter/v2/cars/" . $VIN . "/battery-status?country=FR";
  	callAPIGet($scenario, $url,'battery-status','GET',null);
}

function callAPIGet($scenario, $url,$endpointName,$method,$params) {
  	$scenario->setLog($endpointName);
  	$scenario->setLog('	* Url : ' . $url);
	$ch = curl_init();
  	curl_setopt($ch, CURLOPT_URL, $url);
    $headers = array(
      'Content-type: application/vnd.api+json', 'x-gigya-id_token: ' . urlencode(config::byKey('gigyajwttoken', 'ze')), 'apikey: ' . urlencode(config::byKey('kamereonapikey', 'ze'))
    );
    
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
  
  	if ($params != null) {
      curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
    }

    $json = json_decode(curl_exec($ch), true);
    $scenario->setLog('   endpoint -> ' . $endpointName  . ' json response: ' . json_encode($json));
    curl_close($ch);
}

Un qui pourrait être interessant sera celui de la charges : charge-history et charges
Resultat endpoint charge-history

{
	"data": {
		"type": "Car",
		"id": "VF1XXXX",
		"attributes": {
			"chargeSummaries": [
				{
					"day": "20220621",
					"totalChargesDuration": 303
				},
				{
					"day": "20220622",
					"totalChargesDuration": 0
				},
				{
					"day": "20220623",
					"totalChargesNumber": 1,
					"totalChargesEnergyRecovered": 15.7,
					"totalChargesDuration": 0
				},
				{
					"day": "20220624",
					"totalChargesDuration": 338
				},
				{
					"day": "20220625",
					"totalChargesDuration": 0
				},
				{
					"day": "20220626",
					"totalChargesDuration": 0
				},
				{
					"day": "20220627",
					"totalChargesNumber": 1,
					"totalChargesEnergyRecovered": 10.3,
					"totalChargesDuration": 227
				},
				{
					"day": "20220628",
					"totalChargesDuration": 0
				}
			]
		}
	}
}

Charges

{
	"data": {
		"type": "Car",
		"id": "VF1XXXXXX",
		"attributes": {
			"charges": [
				{
					"chargeStartDate": "2022-06-27T18:11:31Z",
					"chargeEndDate": "2022-06-27T21:58:21Z",
					"chargeDuration": 227,
					"chargeStartBatteryLevel": 53,
					"chargeEndBatteryLevel": 100,
					"chargeEnergyRecovered": 10.3,
					"chargeEndStatus": "ok"
				}
			]
		}
	}
}

qu’en penses tu ?

Il y a aussi des enpoints pour voir le statut de fermeture de la voiture mais cela ne fonctionne pas sur ma Twingo mais peut être sur une zoe
bien a toi ?
@chris94440

pour les endpoints charge-history et charges, je ne les ai pas ajouté puisque les infos sont déjà dans jeedom via le monitoring du % de charge en temps réel.

Pour la fermeture des portes, aucun véhicule ne semble le remonter pour l’instant.

Je pense que tu as commencé à l’appréhender mais les APIs de Renault sont un grand chantier et il est souvent compliqué d’avoir un statut clair sur ce qui est utilisé / fonctionnel. On a même sur certains endpoint des valeurs correctes ou aberrantes en fonction des véhicules ou des millésimes.

Bref, c’est parfois assez compliqué de faire le tri de manière automatique.

1 « J'aime »