Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/04/2020, à 14:02

BenjiBoy

Curl GET sortie au format json -> adapter en sortie type .csv [RESOLU]

Salut tous,

encore avec mes trucs chelou. J'explique :

J'ai une station de mesure sur un site en milieu isolé et alimentation autonome, qui a tout un tas de périphérique qui monitoring sont état de santé (notamment solaire. Non rien à voir avec la vitamine D).

Le périphérique "central" qui gère toutes les données de SoH (state of Health) envoie tout ça sur un serveur dédié du fabricant. Le périphérique en question a un code en python mais il ne faut pas le modifier, d'une part parce que je suis une bugne en python et d'autre part, parce qu'il doit faire des mises à jour régulière donc je risque de perdre telle ou telle fonctionnalité.
Toutes les données collectées par le serveur peuvent être affichées superbement via des widgets de graphes via page web, c'est très chouette.
Mais je dois intégrer les valeurs des graphes sur un outil NagiOS qui gère déjà le reste de nos stations (un paquet).

Heureusement le serveur a un API qui parle en JSON, il suffit donc de faire la bonne requête pour avoir les valeurs.
J'ai effectué pas mal de test de requêtes avant de trouver la bonne "combinaison", via un site de POST JSON string.

Maintenant que j'ai la bonne combinaison, j'ai essayé de faire un fichier de résultat de requête avec un CURL.
Puis du fichier résultat du CURL, je voulais réordonner un peu tout ça pour que ça soit utilisable facilement par le plugin NagiOS.

Donc voici la requête curl que j'effectue :

HP-EliteBook-820-G1:~/$ curl -o test.csv -X GET -H "X-Authorization: Bearer {mon_token}" "https://vrmapi.victronenergy.com/v2/installations/{mon_user_id}/widgets/Graph?attributeCodes[]=V&instance=258&start=1587160800&end=1587247200&interval=15mins"

Et le résultat du fichier sortie "test.csv"

HP-EliteBook-820-G1:~/$ more test.csv 
{"success":true,"records":{"data":{"47":[[1587160856,12.9],[1587161752,12.88],[1587162648,12.87],[1587163544,12.87],[1587164440,12.86],[1587165392,12.85],[1587166232,12.84],[1587167184,12.83],[1587168080,12.82],[1587168976,12.82],[1587169872,12.81]
[...]
[1587242112,12.99],[1587243008,12.97],[1587243904,12.97],[1587244800,12.96],[1587245696,12.95],[1587246592,12.94]]},"meta":{"47":{"code":"V","description":"Voltage","formatValueOnly":"%.2F","formatWithUnit":"%.2F V"}}}}

Note : Vous remarquerez le timestamp format linux.

Et donc le soucis c'est que tout ça sort sur la même ligne, c'est donc très chiant à utiliser sans faire des bricolages.
Mais je vois pas comment sortir le résultat du curl avec des sauts de ligne, un autre format de sortie est en json donc avec des indentations de partout, c'est pas mieux.

Je pensais faire du awk ensuite pour retirer de tout ça un beau tableau mais je sais pas quelle forme adopter. je voudrais lui demander de ne saisir que les valeur qui sont entre "[" et "]" et avec une virgule au milieu.


Vous auriez une idée ?

Dernière modification par BenjiBoy (Le 21/04/2020, à 11:13)

Hors ligne

#2 Le 20/04/2020, à 14:23

pingouinux

Re : Curl GET sortie au format json -> adapter en sortie type .csv [RESOLU]

Bonjour,
Avec l'exemple de fichier test.csv que tu donnes, quelle sortie désires-tu ?

Hors ligne

#3 Le 20/04/2020, à 15:05

Watael

Re : Curl GET sortie au format json -> adapter en sortie type .csv [RESOLU]

salut,

le JSON se traite "facilement" avec jq.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#4 Le 21/04/2020, à 08:14

BenjiBoy

Re : Curl GET sortie au format json -> adapter en sortie type .csv [RESOLU]

Salut,
merci à vous deux

@pingouinux
en partant de cet exemple, il faudrait que j'arrive "au moins" à ça :

1587160856,12.9
1587161752,12.88
1587162648,12.87
1587163544,12.87
1587164440,12.86
1587165392,12.85
[...]
1587243904,12.97
1587244800,12.96
1587245696,12.95
1587246592,12.94

Mais le top, ça serait avec la conversion de date au format linux, au format plus communément utilisé chez nous, que je convertis individuellement pour l'exemple avec cette fonction :

date -d @1587160856 +%j-%Y%m%d-%H:%M:%S

Du coup ça donnerait :

109-20200418-00:00:56,12.9
109-20200418-00:15:52,12.88
109-20200418-00:30:48,12.87
[...]
109-20200418-23:49:52, 12.94

Mais ça fait trop de truc à la fois pour ma petite tête. Je suis bidouilleur, pas informaticien ... Je ne vois pas par quel bout prendre cette conversion.

@Watael
dans la limite du possible j'aimerais éviter de rajouter des fonctions (enfin les admins réseaux surtout), car jq n'est pas présent sur le serveur.

a+

Hors ligne

#5 Le 21/04/2020, à 09:17

pingouinux

Re : Curl GET sortie au format json -> adapter en sortie type .csv [RESOLU]

Essaye ceci :

while IFS=, read dat fin
do
   date -d @$dat +"%j-%Y%m%d-%H:%M:%S,$fin"
done < <(grep -Po "(?<=\[)[^][]+(?=\])" test.csv)

Hors ligne

#6 Le 21/04/2020, à 10:58

kamaris

Re : Curl GET sortie au format json -> adapter en sortie type .csv [RESOLU]

Ou bien avec gawk :

gawk -F'\\[\\[|]]|],\\[' '{for (i=2;i<NF;i++) print strftime("%j-%Y%m%d-%H:%M:%S",$i) "," gensub(".*,","",1,$i)}' test.csv

Hors ligne

#7 Le 21/04/2020, à 11:11

BenjiBoy

Re : Curl GET sortie au format json -> adapter en sortie type .csv [RESOLU]

pingouinux a écrit :

Essaye ceci :

while IFS=, read dat fin
do
   date -d @$dat +"%j-%Y%m%d-%H:%M:%S,$fin"
done < <(grep -Po "(?<=\[)[^][]+(?=\])" test.csv)
kamaris a écrit :

Ou bien avec gawk :

gawk -F'\\[\\[|]]|],\\[' '{for (i=2;i<NF;i++) print strftime("%j-%Y%m%d-%H:%M:%S",$i) "," gensub(".*,","",1,$i)}' test.csv

Pfffffffff ..........
C'est magnifique. Ca fonctionne parfaitement. L'un comme l'autre.

J'aurais mis des éons à sortir un truc pareil.

Me reste plus qu'à faire un script que rassemble tout ces éléments :

- un curl POST pour acquérir le token sur "mon" compte de l'API
- plusieurs curl GET pour obtenir les valeurs qui m'intéressent dans des fichiers type "test.csv"
- appliquer le while sur chacun des test.csv
- placer quelques variables pour l'automatiser toute les heures par exemple
- mettre quelques trap pour faire des messages automatisés d'erreur en cas de problème (on a beaucoup de stations)
- roule ma poule.

Mais maintenant je vais m'en sortir, ça va m'occuper quelques heures.

Merci beaucoup, vous venez de me faire gagner un temps fou !
En un mot : youpi.

a+ !

EDIT : j'ai modifié le titre pour qu'il soit plus éloquent si d'aventure d'autres devaient se trouver dans le même cas.

Dernière modification par BenjiBoy (Le 21/04/2020, à 11:13)

Hors ligne