JSon décodage dans un scénario

Tags: #<Tag:0x00007f28364544e8>

Bonjour,

Je rencontre un petit problème, peut-être que vous auriez une idée.
J’ai parcouru pas mal de topics sans succès car mon cas est un peu spécial.

Voici mon problème :

J’ai un fichier JSon produit toutes les heures avec les infos de ma voiture.

Je voudrais récupérer la valeur « DISTANCE TO EMPTY FUEL » comme le montre la capture d’écran ci-dessous.

Dans cette capture, elle apparait sous la valeur « 15 » mais parfois cette position change, de ce fait je récupère une autre valeur qui n’a rien à voir…

Je pense donc faire un bloc code dans un scénario pour rechercher cette valeur et la positionner dans une variable que je lirai ensuite dans mon virtuel.

La question est donc comment coder cela pour aller chercher et extraire cette valeur (ici « 253 ») ?

Pourriez-vous m’aider svp ?

Merci
Guillaume

Capture d’écran 2020-08-01 à 09.53.32

Salut,

Dans ce cas, un bloc code dans un scénario :

  1. json_decode() pour transformer le json en un tableau avec https://www.php.net/manual/fr/function.json-decode.php, attention au paramétre ‹ true › qui permet l’association ‹ nom › => ‹ valeur ›
  2. Récupérer la valeur associée à ‹ DISTANCE TO EMPTY FUEL › et la convertir en entier
  3. Affichage, traitement etc…

Voilà un petit exemple

$jsonobj = '{"Value1":35,"Value2":37,"DISTANCE TO EMPTY FUEL":43}';
$arrayobj=json_decode($jsonobj,true);
$value=intval($arrayobj["DISTANCE TO EMPTY FUEL"]);
$scenario->setLog($value);

L’intérêt c’est que la position dans le json importe peu, c’est le nom que l’on va chercher

2 J'aimes

Pour info, si tu ne demandes pas un tableau associatif via le 2eme argument, il faut faire ensuite

$arrayobj->{'DISTANCE TO EMPTY FUEL'};

(ok $arrayobj n’est pas très adéquat ici puisque ce n’est pas un array que l’on a récupéré mais un objet)
et donc ->{PROPERTY_NAME} permet de récupérer la valeur de la propriété de l’objet reçu.

l’array est plus adapté si tu veux itérer dessus par exemple

1 J'aime

Oui c’est une autre solution (que je connaissais), perso j’ai juste privilégié l’aspect tableau qui est moins complexe à appréhender que la notion d’objet …
Dans la demande ci-dessus, pas certain que nous ayons besoin de faire un itération du tableau
Bref avec tout ça pas moyen que @cyberlecgui tombe en panne :smiley:

1 J'aime

Merci je vais regarder ça de suite et je vous reviens !

En fait la structure du JSon me semble un peu spéciale car je récupère déjà des valeurs via le plugin script de Jeedom avec le mode « JSon » par exemple le % de carburant restant avec ça :

vehicleStatus>75>value

Mais cette chaine « 75 » possède ensuite 2 paramètres :

  1. Value : 25
  2. key : « FUEL_LEVEL_PERC »

C’est comme ça dans tout mon fichier JSon, mais le problème est que sur certaines valeurs le chiffre change et par exemple passe de 75 à 74 ou autre chose…
Du coup lorsque je l’interroge via le plugin script j’obtiens une autre valeur.

Ici la « key » donc le nom de la propriété ne change pas. L’idée serait donc de rechercher à chaque fois la bonne chaine de de type :

vehicleStatus>??>value pour trouver la valeur recherchée comme l’autonomie ou le niveau de carburant restant…

J’ai essayé d’être le plus clair possible :wink:

Je Json est à votre disposition ici :

http://gofile.me/2LqyM/OHYz9hIQn

Salut,

Tu peux essayer dans cette idée :

$jsonFile = file_get_contents("/var/www/html/data/voiture.json");
$arrayobj = json_decode($jsonFile, true);

foreach ($arrayobj['vehicleStatus'] as $jsonKey) {
  if ($jsonKey['key'] == 'DISTANCE_TO_EMPTY_FUEL') {
	$scenario->setLog('DISTANCE_TO_EMPTY_FUEL : ' . $jsonKey['value']);
  }
}
2 J'aimes

Correcte, le json est en fait un tableau de key-value tout pourri faut bien le dire … « ils » n’ont rien compris

1 J'aime

Hélas ça ne fonctionne pas, voici le résultat du log :


[2020-08-01 18:48:24][SCENARIO] Start : Scenario lance manuellement.
[2020-08-01 18:48:24][SCENARIO] Exécution du sous-élément de type [action] : code
[2020-08-01 18:48:24][SCENARIO] Exécution d’un bloc code
[2020-08-01 18:48:24][SCENARIO] Fin correcte du scénario

Il faut probablement adapter un peu, parce que : avec le fichier au bon endroit c’est impeccable

[2020-08-01 19:01:22][SCENARIO] Start : Scenario lance manuellement.
[2020-08-01 19:01:22][SCENARIO] Exécution du sous-élément de type [action] : code
[2020-08-01 19:01:22][SCENARIO] Exécution d'un bloc code
[2020-08-01 19:01:22][SCENARIO] DISTANCE_TO_EMPTY_FUEL : 253
[2020-08-01 19:01:22][SCENARIO] Fin correcte du scénario

image

1 J'aime

En effet maintenant oui j’avais mal adapté la 1ère ligne car je récupère le fichier sous forme d’URL

Un grand merci pour votre aide, maintenant je regarde pour pousser la valeur directement dans une variable pour aller la lire avec mon virtuel :wink:

Pousser directement dans le virtuel c’est encore plus efficace

Ah tu me rassures :grinning:

Pour inscrire dans une variable :

$scenario->setData('maVariable', $jsonKey['value']);

Dans l’idée tu peux aussi directement pousser la valeur dans une commande grâce à la fonction event() :

cmd::byId($cmd_id)->event($jsonKey['value']);

Ah c’est intéressant ça.
Je suis en train de regarder car je me dis que par ce biais, je peux décoder directement les valeurs qui m’intéressent dans le JSon sans devoir passer par le plugin script et risquer une modification de la structure du JSon.

Encore un petit truc, par exemple dans mon fichier j’ai aussi le retour sur les portes, les vitres ouvertes ou fermées, savez-vous si on peut extraire une valeur binaire comme « 1 » quand la valeur renvoyée par le JSon est CLOSED ?

Bien sûr, avec un ternaire par exemple :

$return = ($jsonValue == 'CLOSED') ? "1" : "0";

En effet, je viens de l’appliquer ainsi et ça fonctionne :

  if ($jsonKey['key'] == 'WINDOW_FRONT_RIGHT_STATUS') {
      	$jsonValue = ($jsonKey['value']);
      	$return = ($jsonValue == 'CLOSED') ? "1" : "0";
    	cmd::byId(3957)->event($return);
  }

En tout cas un grand merci pour votre aide !

1 J'aime