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

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
Alain78
Messages : 75
Inscription : 05 févr. 2022, 09:18

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

Message 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
Dernière modification par Alain78 le 05 févr. 2022, 23:43, modifié 1 fois.
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Problème analyse JSON avec Dzvents

Message par Neutrino »

Bonjour,
Et un truc comme ça :

Code : Tout sélectionner

local humidite = json[DateJour].humidite['2m']
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
Alain78
Messages : 75
Inscription : 05 févr. 2022, 09:18

Re: Problème analyse JSON avec Dzvents

Message 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
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Problème analyse JSON avec Dzvents

Message 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.
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
Alain78
Messages : 75
Inscription : 05 févr. 2022, 09:18

Re: Problème analyse JSON avec Dzvents

Message 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
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Problème analyse JSON avec Dzvents

Message 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

Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
Alain78
Messages : 75
Inscription : 05 févr. 2022, 09:18

Re: Problème analyse JSON avec Dzvents

Message 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
Répondre