Page 1 sur 1

Extraire valeur numérique d'un JSON

Publié : 12 juin 2021, 12:39
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.

Re: Extraire valeur numérique d'un JSON

Publié : 12 juin 2021, 13:28
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

Re: Extraire valeur numérique d'un JSON

Publié : 19 juin 2021, 20:00
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.

Re: Extraire valeur numérique d'un JSON

Publié : 19 juin 2021, 20:51
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

Re: Extraire valeur numérique d'un JSON

Publié : 23 juin 2021, 05:32
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]

Re: Extraire valeur numérique d'un JSON

Publié : 27 juin 2021, 12:51
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 :)