Parse JSON NOAA

Bonjour,
Je souhaite à récupérer les données des champ magnétique terrestre sur le site de la NOAA.
Il est possible de récupérer un JSON à l’adresse Index of /products/solar-wind
exemple : https://services.swpc.noaa.gov/products/solar-wind/mag-5-minute.json donne ceci :

[["time_tag","bx_gsm","by_gsm","bz_gsm","lon_gsm","lat_gsm","bt"],["2021-07-08 11:14:00.000","-1.77","4.73","0.33","110.52","3.77","5.08"],["2021-07-08 11:15:00.000","-1.44","4.91","0.02","106.38","0.28","5.12"]]

Par contre impossible de récupérer les valeurs des données bx_gsm et autres avec le plugin script paramétré en JSON.
Auriez vous une autre astuce svp ?
Merci par avance

Bonjour,

ça devrait pouvoir se faire dans un bloc code de scenario.
avec une requette http
et un json_decode derrière

$tags = $scenario->getTags();
$request_http = new com_http('https://services.swpc.noaa.gov/products/solar-wind/mag-5-minute.json');
$request_http->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
$json=json_decode(trim($request_http->exec()), true);
$resultat = $json[1][0];
/*
 A toi d'aller chercher les autres données 
*/
$tags['#resultat#'] = $resultat;
$scenario->setTags($tags);

bonne journée

1 « J'aime »

Merci, j’avais essayé le script suivant (en regardant d’autres post) mais sans succés :

$api = "https://services.swpc.noaa.gov/products/solar-wind/mag-5-minute.json";
$json = file_get_contents($api);
$scenario->setlog('');
$scenario->setlog($json);
$scenario->setlog('');
$jsonData = json_decode($json,true);
$scenario->setlog('-----DECODE-----');
$scenario->setlog('');
foreach ($jsonData['bx_gsm'] as $jsonKey) 
{
  $scenario->setlog('bx_gsm');
}

J’ai essayé ta proposition mais sans plus de succès, dois je changer quelque chose ?

A noter que j’ai essayé de rajouter la ligne comme tu peux le voir ci dessus dans l’image

$scenario->setlog($json);

Mais je ne vois rien dans les logs (activés en Debug)…
Merci par avance

Chez moi ça fonctionne ça donne le date/time de la 1ere donnée en haut en message non !

noa

à savoir l’élément 1 0 du tableau

Edit : effacement par erreur.
C’est bon j’ai compris mon erreur.
Merci pour ton aide.

1 « J'aime »

Merci aussi pour cette solution.
Je cherche maintenant à récupérer des donnés journalières.

Exemple :

https://services.swpc.noaa.gov/json/goes/primary/differential-electrons-3-day.json

Existe t’il une méthode similaire avec le plugin qui permettrait aussi de récupérer la donnée d’heure pour chaque donnée ou suis je obliger de passer par un scénario avec une boucle foreach par exemple ?
Dans ce cas la comment peut on décoder les données de date et heure ?
Le but serait de déclencher une fois par jour le script ou le scénario pour récupérer les données horodatées.

Merci

Bonjour,

Peut-être cela ?

<?php
$api = "https://services.swpc.noaa.gov/json/goes/primary/differential-electrons-3-day.json";
$json = file_get_contents($api);
$jsonData = json_decode($json,true);
foreach($jsonData as $day_data)
{
    $timestamp =strtotime($day_data['time_tag']);
    $date_jour = date("d-m-Y", $timestamp);
    $_heure = date('G:i:s', $timestamp);
}

?>

A+
Bernard

Merci pour ton retour.
Le code ci dessous fonctionne bien.
Par contre comment rentrer l’horodatage d’une valeur pour un virtuel ?
Je sais envoyer une valeur à un virtuel mais pas horodater cette valeur (en espérant être clair)

//Recuperation du contenu du fichier (JSON complet)
$api = "https://services.swpc.noaa.gov/json/goes/primary/differential-electrons-6-hour.json";
$json = file_get_contents($api);
//Decodage du JSON
$jsonData = json_decode($json,true);
foreach($jsonData as $day_data)
{
//Décodage de la date
  	$timestamp =strtotime($day_data['time_tag']);
    $date_jour = date("d-m-Y", $timestamp);
    $heure = date('h:m:s', $timestamp);

//Décodage des autres données
	$flux = $day_data['flux'];
    $energy = $day_data['energy'];
  
//Debug : affichage des données récupérées
  	$scenario->setlog($heure);
    $scenario->setlog($energy);
}

Re,
Pour être plus clair, tu veux dire que pour chaque valeur tu veux stocker la date de collecte de la valeur.
Si c’est bien cela, alors regarde la fonction event de la commande, elle compren deux paramètres : la valeur et la date de collecte.

A+
Bernard

Merci c’est exactement ça.
Mais je ne vois pas ou mettre la valeur de la date de collecte ci dessous.

Pour faire simple :
Il faut que tu retrouves l’id de la commande qui correspond à la donnée flux ( indiqué dans to virtuel).

Puis , si l’id de la data flux a la valeur 100 par exemple,
$_id = cmd::byId(100);
if(is_object($_id)) {
$_id->event($flux, $timestamp);
}

Faire la même chose pour la valeur energy.
A+
Bernard

Il est possible de retrouver l’id de la commande en fournissant une chaîne de caractères ainsi :
$_id = cmd::byString(’#[objet name][eqlogic name][cmd name]#’);

Merci,
Après essais il apparait que la fonction $timestamp ne donne pas une valeur correcte car j’obtiens ceci :

Capture

J’ai donc modifié la valeur en ajoutant :

$date_virtuel = date('d/m/Y H:i:s', $timestamp);
[...]
$_id->event($flux, $date_virtuel);

Mais j’obtiens ceci :
Capture1

La date de valeur étant erronée, l’affichage graphique ne se fait pas.

Merci par avance.

Apres essais, il semble que la solution ci dessous fonctionne :

    $date_virtuel = date('Y/m/d H:i:s', $timestamp);
//export des donnés vers les virtuels correspondants
$cmd = cmd::byId(1996);
$cmd->addHistoryValue($flux,$_datetime = $date_virtuel); 

Si cela peut servir à quelqu’un

RE,
Effectivement la date doit être passée au format string et non timestamp.

Pour le reste, stockage de la valeur, ici tu vas stocker toutes les valeurs même si elles restent identiques.
A toi de voir si cela convient ou non. Le cmd->event tient compte de la répétition ou non des valeurs.
A+
Bernard

1 « J'aime »

C’est noté, merci pour ton aide

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