Page 1 sur 1

[Résolu]Problème analyse JSON avec Dzvents

Publié : 05 févr. 2022, 10:40
par Alain78
Bonjour,

Je suis en train d'essayer de récupérer les informations météos du site "Infoclimat" et je sèche sur l'analyse JSON sur certains champs. si quelqu'un connait la solution.
Voici le problème:
Le site en requete JSON: https://www.infoclimat.fr/public-api/gf ... 8b897d2013

Le résultat:
{"request_state":200,"request_key":"fd543c77e33d6c8a5e218e948a19e487","message":"OK","model_run":"19","source":"internal:GFS:1","2022-02-04 22:00:00":{"temperature":{"2m":285.5,"sol":283.7,"500hPa":-0.1,"850hPa":-0.1},"pression":{"niveau_de_la_mer":102480},"pluie":0.4,"pluie_convective":0.4,"humidite":{"2m":82.4},"vent_moyen":{"10m":21.6},"vent_rafales":{"10m":26.7},"vent_direction":{"10m":298},"iso_zero":1689,"risque_neige":"non","cape":0,"nebulosite":{"haute":0,"moyenne":0,"basse":0,"totale":100}},"2022-02-05 01:00:00":{"temperature":{"2m":284.7,"sol":282.6,"500hPa":-0.1,"850hPa":-0.1},"pression":{"niveau_de_la_mer":102600},"pluie":0.4,"pluie_convective":0.4,"humidite":

Je lis toutes les valeurs sauf celles qui commencent par un chiffre (2m, 10m etc...)

L'extrait du script qui pose problème:

Code : Tout sélectionner

                local temperature       = json[DateJour].temperature.sol - 273,15
                print(temperature)
                local temperature24h    = json[DateJourPlus1].temperature.sol - 273,15
                print(temperature24h)
                local temperature48h    = json[DateJourPlus2].temperature.sol - 273,15
                print(temperature48h)
                local pression          = json[DateJour].pression.niveau_de_la_mer /100
                print(pression)
                local pression24h       = json[DateJourPlus1].pression.niveau_de_la_mer /100
                print(pression24h)
                local pression48h       = json[DateJourPlus2].pression.niveau_de_la_mer /100
                print(pression48h)
                local pluie             = json[DateJour].pluie
                print(pluie)
                local pluie24h          = json[DateJourPlus1].pluie
                print(pluie24h)
                local pluie48h          = json[DateJourPlus2].pluie
                print(pluie48h)
                local humidite = json[DateJour].humidite.2m
DateJour, DateJourPlus1 et DajeJourPlus2 sont les variables qui gère les séparateurs dates: "2022-02-05 01:00:00"

Dans l'éditeur de Domoticz du script dzvents sur la ligne qui pose le problème:
"local humidite = json[DateJour].humidite.2m" j'ai le message "Unexpected number '0.2' near 'm'"

On dirait que le 2m est vu comme une valeur numérique. Y a t'il un caractère d'échappement pour traiter ce champ en JSON.

Merci de votre aide.
Alain

Re: Problème analyse JSON avec Dzvents

Publié : 05 févr. 2022, 12:02
par Neutrino
Bonjour,
Et un truc comme ça :

Code : Tout sélectionner

local humidite = json[DateJour].humidite['2m']

Re: Problème analyse JSON avec Dzvents

Publié : 05 févr. 2022, 12:17
par Alain78
Bonjour,

Merci pour la proposition, mais effectivement j'avais essayé déjà pleins de possibilités avec des ", {,' etc..

"2022-02-06 04:00:00":
{"temperature":
{"2m":280.9,
"sol":281.3,
"500hPa":-0.1,
"850hPa":-0.1},
"pression":
{"niveau_de_la_mer":102810},
"pluie":0,
"pluie_convective":0,
"humidite":
{"2m":88.1},

Voici la vue en développé et la lecture de sol: fonctionne, de pluie: aussi par contre 2m: ne fonctionne pas, toujours l'erreur dans l'éditeur.

Alain

Re: Problème analyse JSON avec Dzvents

Publié : 05 févr. 2022, 12:41
par Neutrino
J'irais à la facilité et remplacerai directement 2m dans le résultat par autre chose.

Code : Tout sélectionner

local result = result:gsub('2m','twom')
Ce qui donnerait :

Code : Tout sélectionner

local humidite = json[DateJour].humidite.twom
C'est pas très élégant mais ça devrait fonctionner.

Re: Problème analyse JSON avec Dzvents

Publié : 05 févr. 2022, 15:28
par Alain78
Bonjour Neutrino,

Merci pour cette proposition, je n'y avais pas pensé. Par contre je ne comprend pas trop comment la modification est faite.
C'est dans le tableau JSON complet que je dois faire la modification ? Je ne suis pas un expert du traitement des données JSON.
Mon script pour le traitement JSON:

Code : Tout sélectionner

        if item.isHTTPResponse then
		if (item.ok and item.isJSON) then
			-- local someValue = item.json.someValue  -- just an example
			local json = domoticz.utils.fromJSON(item.data)
					
                if #item.data > 0 then
                    domoticz.data.ForecastDolus = domoticz.utils.fromJSON(item.data)
                    -- domoticz.utils.dumpTable(item.json)
                    rt = domoticz.utils.fromJSON(item.data)
                    print (rt)
                else
                    domoticz.log("Problem with response from Infoclimat (no data) using data from earlier run",domoticz.LOG_ERROR)
                    rt  = domoticz.data.ForecastDolus     -- json empty. Get last valid from domoticz.data
                    print (rt)
                    if #rt < 1 then                  -- No valid data in domoticz.data either
                        domoticz.log("No previous data. are InfoClimatAPIkey and geolocalisation ok?",domoticz.LOG_ERROR)
                    end
           	end

                local pluie             = json[DateJour].pluie
                print(pluie)
                local pluie24h          = json[DateJourPlus1].pluie
                print(pluie24h)
                local pluie48h          = json[DateJourPlus2].pluie
                print(pluie48h)
                local result = result:gsub('2m','twom')
                local humidite = json[DateJour].humidite.twom
                print(humidite)
                local humidite24h = json[DateJourPlus1].humidite.twom
                print(humidite24h)
                local humidite48h = json[DateJourPlus2].humidite.twom
                print(humidite48h)
	 else
		    domoticz.log('There was a problem handling the request', domoticz.LOG_ERROR)
		    domoticz.log(item, domoticz.LOG_ERROR)
         end

	 end

Ou dois je mettre le "local result = result:gsub('2m','twom')"

Merci de ton aide.

Alain

Re: Problème analyse JSON avec Dzvents

Publié : 05 févr. 2022, 16:15
par Neutrino
Essaye en modifiant ta ligne local json.... comme ça :

Code : Tout sélectionner

        if item.isHTTPResponse then
		if (item.ok and item.isJSON) then
			-- local someValue = item.json.someValue  -- just an example
			local json = domoticz.utils.fromJSON(item.data:gsub('2m','twom'))
					
                if #item.data > 0 then
                    domoticz.data.ForecastDolus = domoticz.utils.fromJSON(item.data)
                    -- domoticz.utils.dumpTable(item.json)
                    rt = domoticz.utils.fromJSON(item.data)
                    print (rt)
                else
                    domoticz.log("Problem with response from Infoclimat (no data) using data from earlier run",domoticz.LOG_ERROR)
                    rt  = domoticz.data.ForecastDolus     -- json empty. Get last valid from domoticz.data
                    print (rt)
                    if #rt < 1 then                  -- No valid data in domoticz.data either
                        domoticz.log("No previous data. are InfoClimatAPIkey and geolocalisation ok?",domoticz.LOG_ERROR)
                    end
           	end

                local pluie             = json[DateJour].pluie
                print(pluie)
                local pluie24h          = json[DateJourPlus1].pluie
                print(pluie24h)
                local pluie48h          = json[DateJourPlus2].pluie
                print(pluie48h)
                local result = result:gsub('2m','twom')
                local humidite = json[DateJour].humidite.twom
                print(humidite)
                local humidite24h = json[DateJourPlus1].humidite.twom
                print(humidite24h)
                local humidite48h = json[DateJourPlus2].humidite.twom
                print(humidite48h)
	 else
		    domoticz.log('There was a problem handling the request', domoticz.LOG_ERROR)
		    domoticz.log(item, domoticz.LOG_ERROR)
         end

	 end


Re: Problème analyse JSON avec Dzvents

Publié : 05 févr. 2022, 21:14
par Alain78
Merci beaucoup,

Effectivement cela résout le problème.
La commande suivant fonctionne: "local json = domoticz.utils.fromJSON(item.data:gsub('2m','twom'):gsub('10m','tenm'))

J'avais aussi un champ avec 10m.

Je vais quand même chercher si il existe un moyen plus propre pour réaliser cette opération et je vous informerai si je trouve une solution.

Merci de ton aide.

Alain