Impossible d'extraire une donnée d'un JSON pourtant valide

Bonjour,
J’ai besoin d’un petit coup de main, je tourne en rond depuis un moment.
J’ai un système de chauffage qui peut à la demande renvoyer des infos utiles sous format Json. Il propose plusieurs categories de données qui peuvent être interrogées séparément.

Je me suis dit que l’approche sera aisée avec le plugin Script. Cependant Script ne fonctionne que pour une seule catégorie alors que le format Json est le même pour toutes !

Sur un browser j’obtiens avec l’adresse : 192.168.1.137:4321/monpsw/system

{
 "system":{
  "L_ambient":165, 
  "L_errors":0, 
  "L_usb_stick":0, 
  "L_existing_boiler":0
 }
}

Avec le plugin-Script je lance une requête sur L_Ambient et j’obtiens bien 165. Parfait !
(requête system>L_ambient).

Mon souci se situe pour la catégorie qui contient les infos désirées. Sur un browser j’obtiens toujours les infos avec l’adresse : 192.168.1.137:4321/monpsw/hk1 (validé à l’aide de https://jsonformatter.curiousconcept.com)

{
 "hk1":{
  "L_roomtemp_act":163, 
  "L_roomtemp_set":80, 
  "L_flowtemp_act":161, 
  "L_flowtemp_set":80, 
  "L_comfort":0, 
  "L_state":8, 
  "L_statetext":"Mode arrêt",
  "L_pump":0, 
  "remote_override":0, 
  "mode_auto":1, 
  "time_prg":0, 
  "temp_setback":180, 
  "temp_heat":200, 
  "temp_vacation":150, 
  "name":"", 
  "oekomode":0, 
  "autocomfort":-1, 
  "autocomfort_sunset":0, 
  "autocomfort_sunrise":0
 }
}

La requête dans le plugin script me renvoie une erreur m’indiquant ‹ Unexpected end in Json INPUT ›.
J’ai parcouru les sujets de la communauté sans pouvoir régler mon souci. J’ai même tenté en suivant les conseils de certains posts, un json decode dans un bloc code de scenario. Tout fonctionne pour le json system mais pas pour le second. je joins les logs du second ci-dessous ainsi que le bloc code à l’origine:

[2022-05-05 15:54:22][SCENARIO] -- Start : Scenario lance manuellement.
[2022-05-05 15:54:22][SCENARIO] - Exécution du sous-élément de type [action] : code
[2022-05-05 15:54:22][SCENARIO] Exécution d'un bloc code 
[2022-05-05 15:54:22][SCENARIO] -----RAW----------
[2022-05-05 15:54:22][SCENARIO] {
"hk1":{
"L_roomtemp_act":163,
"L_roomtemp_set":80,
"L_flowtemp_act":162,
"L_flowtemp_set":80,
"L_comfort":0,
"L_state":8,
"L_statetext":"Mode arr?t",
"L_pump":0,
"remote_override":0,
"mode_auto":1,
"time_prg":0,
"temp_setback":180,
"temp_heat":200,
"temp_vacation":150,
"name":"",
"oekomode":0,
"autocomfort":-1,
"autocomfort_sunset":0,
"autocomfort_sunrise":0
}
}
[2022-05-05 15:54:22][SCENARIO]
[2022-05-05 15:54:22][SCENARIO] -------DECODE----------
[2022-05-05 15:54:22][SCENARIO]
[2022-05-05 15:54:22][SCENARIO]
[2022-05-05 15:54:22][SCENARIO] temp Value :
[2022-05-05 15:54:22][SCENARIO] state Value :
[2022-05-05 15:54:22][SCENARIO] cons Value :
[2022-05-05 15:54:22][SCENARIO] Fin correcte du scénario

le bloc code :

$api = "http://192.168.1.137:4321/monpsw/hk1";
$json = file_get_contents($api);
$scenario->setlog('-----RAW----------');
$scenario->setlog($json);
$scenario->setlog('');
$jsonData = json_decode($json,true);
$scenario->setlog('-------DECODE----------');
$scenario->setlog($jsonData);
$scenario->setlog('');
$temp=$jsonData['hk1']['L_roomtemp_act'];
$state=$jsonData['hk1']['L_statetext'];
$cons=$jsonData['hk1']['L_roomtemp_set'];
$scenario->setlog('temp Value : ' . $temp);
$scenario->setlog('state Value : ' . $state);
$scenario->setlog('cons Value : ' . $cons);

l’accent circonflexe indique peut-être un souci de ce côté, je ne sais plus par où chercher… :-/
merci d’avance pour votre écoute
mike

Bonjour,

Faite un test avec un fichier json identique mais sans l’accent et vous serez fixé :wink:

Hello Mips,
merci pour ton aide, il semble bien y avoir un rapport en effet. Sur les 5 json consultables, 3 fonctionnent et les deux derniers contiennent chacun le mot « arrêt » avec son accent.

Ai je un moyen selon toi de nettoyer, convertir ou substituer les champs du Json ?

Dans un bloc code oui, dans le core il existe la fonction sanitizeAccent($_message); à priori utilisable directement.

Donc sur le json, avant le decode:

$json = sanitizeAccent($json);

Malheureusement, cela n’a pas suffit. Lorsque l’on regarde le Json en RAW dans les logs du bloc code le caractère avec accent est remplacé par un ‹ ? ›. Ainsi le sanitizeaccent peut il faire son job?

Il doit y avoir un soucis d’encodage.
Faudrait tester avec curl au lieu de file_get_content

1 « J'aime »

C’est une piste, je vais essayer.

J’ai remarqué autre chose c’est que lorsque cela fonctionne isarray est à true sinon ce n’est pas le cas. Peut etre une autre piste.

J’ai essayé avec curl et le résultat est identique

bloc code :

$json=shell_exec('curl "http://192.168.1.137:4321/1OHC/hk1"');
$scenario->setLog('	* response : ' . $json);

logs :

------------------------------------
[2022-05-05 20:13:15][SCENARIO] Start : Scenario lance manuellement.
[2022-05-05 20:13:15][SCENARIO] Exécution du sous-élément de type [action] : code
[2022-05-05 20:13:15][SCENARIO] Exécution d'un bloc code
[2022-05-05 20:13:15][SCENARIO] 	* response : {
"hk1":{
"L_roomtemp_act":161,
"L_roomtemp_set":80,
"L_flowtemp_act":163,
"L_flowtemp_set":80,
"L_comfort":0,
"L_state":8,
"L_statetext":"Mode arr?t",
"L_pump":0,
"remote_override":0,
"mode_auto":1,
"time_prg":0,
"temp_setback":180,
"temp_heat":200,
"temp_vacation":150,
"name":"",
"oekomode":0,
"autocomfort":-1,
"autocomfort_sunset":0,
"autocomfort_sunrise":0
}
}
[2022-05-05 20:13:15][SCENARIO] Fin correcte du scénario

Yo
Peut être en encodant en utf8 avant la chaîne string
utf8_encode( *string* $string )
Et en réalisant ton json_decode…ensuite
Update
Ou alors en mode bourrin remplacer tous les caractères spéciaux…

$unwanted_array = array(    'Š'=>'S', 'š'=>'s', 'Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
                            'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U',
                            'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c',
                            'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o',
                            'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y' );

$str = strtr( $str, $unwanted_array );

D’où la fonction du core que je proposais avant qui fait déjà ça :wink:

Un curl Php directement plutôt qu’un shellexec ?
Puis y a l’affichage du log dans le scénario, le problème d’encodage est p-e là…
C’est un peu compliqué de debug ce genre de chose au travers d’un forum…

Dsl je suis loin de mon jeedom cette semaine …pas pu regarder ce que faisais la fonction évoquée…:grin:

C’est facile, elle a un nom explicite :stuck_out_tongue:

Je m’avoue vaincu…:exploding_head:

Hello,
merci à vous deux pour votre aide.
utf8_encode n’a pas fonctionné chez moi et la méthode bourrin non plus. Mips a raison en disant en disant que le debug n’est pas simple sur un forum. Alors je ne vais pas m’acharner. Je bascule l’interface de ma chaudière en Anglais. Je n’ai plus d’accent et mon bloc code fonctionne !!

1 « J'aime »

:joy:

efficace au moins

@chris94440, un immense merci j’ai réussi à trouver la solution grâce à toi. J’ai réussi à intégrer utf8_encode( string $string ) et finalement je json est décodé comme attendu.

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.