Code dans scenario lecture json chaine avec double quote

Bonjour,

J’ai démarré un script dans scénario pour récupérer les valeurs d’un json (retour d’un curl GET pour les infos de ma Tesla).

Ex du bloc json qui m’intéresse :

{"response":{"result":true,"reason":"The request was successfully processed.","vin":"LRWYGCFS9PC11111","command":"vehicle_data","response":{"charge_state":{"timestamp":1737126831,"charging_state":"Disconnected","charge_limit_soc":100,"charge_limit_soc_std":80,"charge_limit_soc_min":50,"charge_limit_soc_max":100,"battery_heater_on":false,"not_enough_power_to_heat":false,"max_range_charge_counter":20,"fast_charger_present":false,"fast_charger_type":"\u003cnil\u003e","battery_range":195.63318,"est_battery_range":203.63884,"ideal_battery_range":195.63318,"battery_level":78,"usable_battery_level":77,"charge_energy_added":42.82,"charge_miles_added_rated":187,"charge_miles_added_ideal":187,"charger_voltage":2,"charger_pilot_current":16,"charger_actual_current":0,"charger_power":0,"trip_charging":false,"charge_rate":0,"charge_port_door_open":false,"scheduled_charging_mode":"ScheduledChargingModeStartAt","scheduled_departure_time":1737273600,"scheduled_departure_time_minutes":0,"supercharger_session_trip_planner":false,"scheduled_charging_start_time":1737147600000,"scheduled_charging_pending":false,"user_charge_enable_request":false,"charge_enable_request":false,"charger_phases":0,"charge_port_latch":"Engaged","charge_current_request":16,"charge_current_request_max":16,"charge_amps":16,"off_peak_charging_enabled":false,"off_peak_charging_times":"weekdays","off_peak_hours_end_time":0,"preconditioning_enabled":false,"preconditioning_times":"weekdays","managed_charging_active":false,"managed_charging_user_canceled":false,"managed_charging_start_time":0,"charge_port_cold_weather_mode":false,"charge_port_color":"ChargePortColorOff","conn_charge_cable":"\u003cnil\u003e","fast_charger_brand":"\u003cnil\u003e","minutes_to_full_charge":0}}}}

Je veux récupérer certaines valeurs en entier (sans les "), booleans, et des chaines (avec ").
OK pour les entiers (et booleans) mais pas pour les chaines, elles sont toujours vides :

Log scénario :

[2025-01-17 16:13:46][SCENARIO] -- Début : Scenario lance manuellement.
[2025-01-17 16:13:46][SCENARIO] - Exécution du sous-élément de type [action] : code
[2025-01-17 16:13:46][SCENARIO] Exécution d'un bloc code
[2025-01-17 16:13:52][SCENARIO] la fonction renvoie  : {"response":{"result":true,"reason":"The request was successfully processed.","vin":"LRWYGCFS9PC11111","command":"vehicle_data","response":{"charge_state":{"timestamp":1737126831,"charging_state":"Disconnected","charge_limit_soc":100,"charge_limit_soc_std":80,"charge_limit_soc_min":50,"charge_limit_soc_max":100,"battery_heater_on":false,"not_enough_power_to_heat":false,"max_range_charge_counter":20,"fast_charger_present":false,"fast_charger_type":"\u003cnil\u003e","battery_range":195.63318,"est_battery_range":203.63884,"ideal_battery_range":195.63318,"battery_level":78,"usable_battery_level":77,"charge_energy_added":42.82,"charge_miles_added_rated":187,"charge_miles_added_ideal":187,"charger_voltage":2,"charger_pilot_current":16,"charger_actual_current":0,"charger_power":0,"trip_charging":false,"charge_rate":0,"charge_port_door_open":false,"scheduled_charging_mode":"ScheduledChargingModeStartAt","scheduled_departure_time":1737273600,"scheduled_departure_time_minutes":0,"supercharger_session_trip_planner":false,"scheduled_charging_start_time":1737147600000,"scheduled_charging_pending":false,"user_charge_enable_request":false,"charge_enable_request":false,"charger_phases":0,"charge_port_latch":"Engaged","charge_current_request":16,"charge_current_request_max":16,"charge_amps":16,"off_peak_charging_enabled":false,"off_peak_charging_times":"weekdays","off_peak_hours_end_time":0,"preconditioning_enabled":false,"preconditioning_times":"weekdays","managed_charging_active":false,"managed_charging_user_canceled":false,"managed_charging_start_time":0,"charge_port_cold_weather_mode":false,"charge_port_color":"ChargePortColorOff","conn_charge_cable":"\u003cnil\u003e","fast_charger_brand":"\u003cnil\u003e","minutes_to_full_charge":0}}}}
[2025-01-17 16:13:52][SCENARIO] Variable Chaby_Result = true
[2025-01-17 16:13:52][SCENARIO] Variable Chaby_Charging_state =
[2025-01-17 16:13:52][SCENARIO] Variable Chaby_Charge_limit_soc_max = 100
[2025-01-17 16:13:53][SCENARIO] Variable Chaby_battery_level = 78
[2025-01-17 16:13:53][SCENARIO] Variable Chaby_charge_amps = 16
[2025-01-17 16:13:53][SCENARIO] Variable Chaby_charger_voltage = 2
[2025-01-17 16:13:53][SCENARIO] Fin correcte du scénario

Mon scénario :

$json = system("curl -X 'GET' \
  'http://localhost:5678/api/1/vehicles/LRWYGCFS9PC11111/vehicle_data?endpoints=charge_state'");

$json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);


if (!empty($json))
{
  $findme   = 'response';
  $pos = strpos($json, $findme);
  $scenario->setLog('la fonction renvoie  : ' .$json);
  if ($pos === false)
  {
    $scenario->setLog('Erreur de retour de la fonction CURL, la fonction renvoie  : ' .$json);
  }
  else
  {
    $obj = json_decode($json, TRUE);
    $b = 'Chaby_'; // Préfixe nom de variable
    if (json_last_error() === JSON_ERROR_NONE) 
    {
      
      
      if($obj['response']['result'])
      {
          $Result = "true";    
      }
      else {
          $Result = "false";   
      }
      $scenario->setLog('Variable ' . $b . 'Result = ' . $Result);
      $scenario->setData($b . 'Result', $Result);
      //cmd::byString('#[Maison][Fronius][Puissance]#')->event(($P));
      
      //$ChargingState = $obj['response']['response']['charge_state']['charging_state'];
      $ChargingState = $obj->response->response->charge_state->charging_state;
      $scenario->setLog('Variable ' . $b . 'Charging_state = ' . $Charging_state);
      $scenario->setData($b . 'Charging_state', $Charging_state);
      
      $ChargeLimitSocMax = $obj['response']['response']['charge_state']['charge_limit_soc_max'];
      $scenario->setLog('Variable ' . $b . 'Charge_limit_soc_max = ' . $ChargeLimitSocMax);
      $scenario->setData($b . 'Charge_limit_soc_max', $ChargeLimitSocMax);
      
      $BatteryLevel = $obj['response']['response']['charge_state']['battery_level'];
      $scenario->setLog('Variable ' . $b . 'battery_level = ' . $BatteryLevel);
      $scenario->setData($b . 'battery_level', $BatteryLevel);
      
      $ChargeAmps = $obj['response']['response']['charge_state']['charge_amps'];
      $scenario->setLog('Variable ' . $b . 'charge_amps = ' . $ChargeAmps);
      $scenario->setData($b . 'charge_amps', $ChargeAmps);
      
      $ChargerVoltage = $obj['response']['response']['charge_state']['charger_voltage'];
      $scenario->setLog('Variable ' . $b . 'charger_voltage = ' . $ChargerVoltage);
      $scenario->setData($b . 'charger_voltage', $ChargerVoltage);
      
  
    }
  }
}
else
{
  $scenario->setLog('Erreur json est : ' . $json_errors[json_last_error()]);
}

J’ai tenté plein de choses avec des propriétés de json_decode ou des regex de remplacement du net sans trop de succès et je ne voudrais pas que ça devienne un usine à gaz.

Il y aurait un expert en php/json/regex :wink: pour me conseiller ?

Merci

Bonjour, je pense que cette syntaxe était la bonne.

Par contre ici tu a utilisé la variable $Charging_state au lieu de $ChargingState donc forcément elle est vide :slight_smile:

Voici comment je ferais pour ne pas créer 1 nouvelle variable à chaque item, mais ne pas trainer toute la hiérarchie non plus:

      $charge_state = $obj['response']['response']['charge_state'];
      $scenario->setLog('Variable ' . $b . 'Charging_state = ' . $charge_state['charging_state']);
      $scenario->setData($b . 'Charging_state', $Charging_state);
      
      $scenario->setLog('Variable ' . $b . 'Charge_limit_soc_max = ' . $charge_state['charge_limit_soc_max']);
      $scenario->setData($b . 'Charge_limit_soc_max', $charge_state['charge_limit_soc_max']);
      
      $scenario->setLog('Variable ' . $b . 'battery_level = ' . $charge_state['battery_level']);
      $scenario->setData($b . 'battery_level', $charge_state['battery_level']);
      
      $scenario->setLog('Variable ' . $b . 'charge_amps = ' . $charge_state ['charge_amps']);
      $scenario->setData($b . 'charge_amps', $charge_state ['charge_amps']);
      
      $scenario->setLog('Variable ' . $b . 'charger_voltage = ' . $charge_state['charger_voltage']);
      $scenario->setData($b . 'charger_voltage', $charge_state['charger_voltage']);
      

Tu peux essayer ça :

$json = system("curl -X 'GET' 'http://localhost:5678/api/1/vehicles/LRWYGCFS9PC11111/vehicle_data?endpoints=charge_state'");

$data = json_decode($json, true);

if (isset($data['response']['response']['charge_state'])) {
    $chargeState = $data['response']['response']['charge_state'];

    $batteryLevel = $chargeState['battery_level'];
    $chargingState = $chargeState['charging_state'];
    $chargeLimitSoc = $chargeState['charge_limit_soc'];
    $chargeLimitSocMax = $chargeState['charge_limit_soc_max'];
    $chargeAmps = $chargeState['charge_amps'];
    $chargerVoltage = $chargeState['charger_voltage'];

    $scenario->setLog("État de charge : $chargingState");
    $scenario->setLog("Limite maximale de charge SOC : $chargeLimitSocMax%");
    $scenario->setLog("Niveau de batterie : $batteryLevel%");
    $scenario->setLog("Intensité de charge (ampères) : $chargeAmps A");
    $scenario->setLog("Tension du chargeur : $chargerVoltage V");
} 
else {
    $scenario->setLog ("Données de charge introuvables.");
}
[2025-01-19 12:05:49][SCENARIO] État de charge : Disconnected
[2025-01-19 12:05:49][SCENARIO] Limite maximale de charge SOC : 100%
[2025-01-19 12:05:49][SCENARIO] Niveau de batterie : 78%
[2025-01-19 12:05:49][SCENARIO] Intensité de charge (ampères) : 16 A
[2025-01-19 12:05:49][SCENARIO] Tension du chargeur : 2 V
2 « J'aime »

Roo, j’avais le nez dessus et je ne le voyais pas… :face_with_spiral_eyes:

Merci pour le retour et vos optimisations ! J’en profiter pour améliorer tout ça !!

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