Extraire valeur numérique d'un JSON

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 <\>.
dokho
Messages : 685
Inscription : 28 déc. 2014, 19:32

Extraire valeur numérique d'un JSON

Message par dokho »

Bonjour,

Pour un de mes scripts je récupère la valeur "CounterToday" d'un compteur via un requête curl.

La valeur que je récupère est au format suivant:

Code : Tout sélectionner

0.096 kWh
Sauf que j'ai besoin de faire des calcul sur cette valeur et je ne pense pas qu'en l'état cela fonctionne.

Quelqu'un peut il m'indiquer comment ne récupérer que la partie numérique ?


Merci.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Extraire valeur numérique d'un JSON

Message par Keros »

En LUA, je le faisais en coupant la chaine de caractères avant l'espace :

Code : Tout sélectionner

Valeur = tonumber(split(counterToday,' '))
En DzVents, c'est plus facile :

Code : Tout sélectionner

valeur = domoticz.devices('Nom_compteur').counterToday
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
dokho
Messages : 685
Inscription : 28 déc. 2014, 19:32

Re: Extraire valeur numérique d'un JSON

Message par dokho »

Bonjour,

Désolé pour la réponse tardive.

Ca ne fonctionne pas, j'ai une erreur:

Code : Tout sélectionner

2021-06-19 19:54:15.791  Status: User: Admin initiated a switch command (124/TEST1/On)
2021-06-19 19:54:15.796  (Dummy) Light/Switch (TEST1)
2021-06-19 19:54:15.922  Status: LUA: Update DUMMYTEST
2021-06-19 19:54:16.016  Status: LUA: avant decoupe 0.442 kWh 
2021-06-19 19:54:16.016  Error: EventSystem: in /home/domoticz/domoticz/scripts/lua/script_device_test.lua: /home/domoticz/domoticz/scripts/lua/script_device_test.lua:31: attempt to concatenate a nil value (local 'startdaycounter1')
Voici le script (désolé c'est un peu brouillon le temps des tests):

Code : Tout sélectionner

commandArray = {}

local function split(s, delimiter)
        local result = {}
        for match in (s..delimiter):gmatch('(.-)'..delimiter) do
                table.insert(result, match)
        end
        return result
end


if (devicechanged['TEST1'] == 'On')
then
print ("Update DUMMYTEST")
--local startdaycounter = otherdevices_svalues['[Conso] Machine à laver']:match("([^;]+)")


 json = (loadfile "/home/domoticz/domoticz/scripts/lua/JSON.lua")()
    local config = assert(io.popen('/usr/bin/curl "http://192.168.0.232:8080/json.htm?type=devices&rid=230"'))
        local blocjson = config:read('*all')
        config:close()
        local jsonValeur = json:decode(blocjson)
        startdaycounter = jsonValeur.result[1].CounterToday

local startdaycounter = tostring(startdaycounter)

print("avant decoupe " .. startdaycounter .. " ")

local startdaycounter1 = tonumber(split(startdaycounter,' '))

print("apres decoupe" .. startdaycounter1 .. " ")








end
return commandArray
@Keros: tu peux me donner le code de ta fonction split s'il te plait ?


Merci.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Extraire valeur numérique d'un JSON

Message par Keros »

Pardon, lorsque j'ai copié mon code, je n'ai pas vu la fonction que j'avais au-dessus.

Voilà le code

Code : Tout sélectionner

local function split(s, delimiter)
	local result = {}
	for match in (s..delimiter):gmatch('(.-)'..delimiter) do
		table.insert(result, match)
	end
	return result
end
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Extraire valeur numérique d'un JSON

Message par denis_brasseur »

S'agissant d'un tableau, la syntaxe est incomplète, il te faut indiquer l'indice du tableau :

Code : Tout sélectionner

print('avant decoupe ' .. startdaycounter)
local t = split(startdaycounter, ' ')
print('apres decoupe ' .. t[1])
ou plus simplement

Code : Tout sélectionner

local startdaycounter1 = split(startdaycounter,' ')[1]
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
dokho
Messages : 685
Inscription : 28 déc. 2014, 19:32

Re: Extraire valeur numérique d'un JSON

Message par dokho »

Bonjour,

Merci ça fonctionne, du moins pour la fonction split.

J'ai toujours un pb pour le calcul de consommation. Je regarde de plus prés et si je ne trouve pas je reviens vers vous :)
Répondre