Page 1 sur 2

[LUA] Recuperer de compteur du jour dans une variable

Publié : 02 nov. 2024, 15:35
par Guigui
Bonjour a tous,

Je souhaite mettre a jour un device virtuel avec le cout de la recharge de mon véhicule électrique


Je récupère bien les valeurs de conso instantané ainsi que la donnée contenant le comptage depuis la création du device, mais....


impossible de recevoir le compteur du jour !

data_day = domoticz.devices('Compteur_Conso_VE').counterToday

ne fonctionne pas...


Auriez vous une idée pour me sortir de cette impasse ?


LOG

2024-11-02 15:20:33.081 Error: EventSystem: in Cout_Charge_VE: [string "local idx = 2714 --idx du device virtual tari..."]:24: attempt to index a nil value (global 'domoticz')
2024-11-02 15:20:38.069 Error: EventSystem: in Cout_Charge_VE: [string "local idx = 2714 --idx du device virtual tari..."]:24: attempt to index a nil value (global 'domoticz')
2024-11-02 15:20:47.089 Error: EventSystem: in Cout_Charge_VE: [string "local idx = 2714 --idx du device virtual tari..."]:24: attempt to index a nil value (global 'domoticz')
2024-11-02 15:20:47.930 Error: EventSystem: in Cout_Charge_VE: [string "local idx = 2714 --idx du device virtual tari..."]:24: attempt to index a nil value (global 'domoticz')
2024-11-02 15:20:52.089 Error: EventSystem: in Cout_Charge_VE: [string "local idx = 2714 --idx du device virtual tari..."]:24: attempt to index a nil value (global 'domoticz')

Code : Tout sélectionner

local idx = 2714 --idx du device virtual tarif charge VE
local compteur_elec = 'Compteur_Conso_VE' --nom du compteur_elec
local prix_kwh = '0.188237'


function round(num, dec)
   if num == 0 then
	 return 0
   else
	 local mult = 10^(dec or 2)
	 return math.floor(num * mult + 0.5) / mult
   end
end




commandArray = {}

if (devicechanged[compteur_elec]) then
    
    -- Récupération des valeurs du compteur 
    p1, p2 = string.match(otherdevices_svalues[compteur_elec], "(%d+.%d*);(%d+.%d*)")
    
    
    ----------------------------------------------------------------------
    -- LA EST MON PROBLEME
    
    
        data_day = domoticz.devices('Compteur_Conso_VE').counterToday
        
        
         
        -- POK data_day = domoticz.devices([compteur_elec]).counterToday 
        -- POK data_day = domoticz.devices(2674).counterToday
        
        
    ------------------------------------------------------------------------
    
    
    
    
    
    
    print('P1', p1 )
    print('P2', p2 )
    print('Conso du jour', data_day )
     
    -- Calcul du coût en euros
	prix_charge_VE = data_day * prix_kwh / 1000
	
    -- Arrondir le prix à 2 chiffres après la virgule
	prix_charge_VE  = round(prix_charge_VE, 2)
	
	-- Affichage du tarif pour vérification
	print('Tarif jour : ', prix_charge_VE)
	
	-- Mise à jour du dispositif virtuel
	commandArray[#commandArray+1]={['UpdateDevice'] = idx..'|0|'..prix_charge_VE} ---- mise a jour du device virtuel
end

return commandArray

Re: [LUA] Recuperer de compteur du jour dans une variable

Publié : 02 nov. 2024, 17:44
par denis_brasseur
Tu mélanges LUA et DzVents
commandArray = {} : c'est du LUA
domoticz.devices('Compteur_Conso_VE').counterToday : c'est du DzVents

Re: [LUA] Recuperer de compteur du jour dans une variable

Publié : 02 nov. 2024, 20:44
par Guigui
Alors ma demande est simple: quelle est la commande LUA pour avoir le même résultat que


domoticz.devices('Compteur_Conso_VE').counterToday


Python, bash, java... sont bien documentés.

Pas trop LUA :?



j'ai une piste avec

Code : Tout sélectionner

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- for PI

-- L'appel et l'enregistrement des donnees dans la variable jsonValeur

  config=assert(io.popen('/usr/bin/curl "http://192.168.0.20:8080/json.htm?type=command&param=getdevices&rid=2678"'))
  blocjson = config:read('*all')
  config:close()
  jsonValeur = json:decode(blocjson)

 conso_jour = jsonValeur.result
print ('Conso_journaliere', conso_jour)

Re: [LUA] Recuperer de compteur du jour dans une variable

Publié : 02 nov. 2024, 21:18
par Keros
En général, le LUA est plus facile à prendre en main que le DzVents mais les fonctions sont limitées quand on commence à toucher des compteurs. Souvent, il faut passer par des appels API (comme tu as trouvé) pour récupérer la donnée de façon "brute".
À plusieurs reprises, j'avais dû ruser pour faire les calculs dont j'avais besoin. Le passage en DzVents m'a permis de simplifier tout ça.

Re: [LUA] Recuperer de compteur du jour dans une variable

Publié : 03 nov. 2024, 16:29
par Guigui
Parser le json ne fonctionne pas

jsonValeur.result


me retourne un null.

Mais j'avance =)

Re: [LUA] Recuperer de compteur du jour dans une variable

Publié : 03 nov. 2024, 17:11
par Keros
Tu fais ton script en LUA ou en DzVents ?

Il serait plus facile pour nous de voir ton script entier, car le souci ne vient pas forcément de la ligne indiquée dans l'erreur, mais d'une ligne un peu plus haut dans le script. (et je n'aurais pas eu besoin de te poser la question juste au-dessus ;) )

Si besoin d'aide pour récupérer les données d'un Json, tu peux regarder mon tuto sur OpenWeatherMap (lien dans la signature).

Re: [LUA] Recuperer de compteur du jour dans une variable

Publié : 03 nov. 2024, 18:12
par Guigui
Sur'


voici mon code

Code : Tout sélectionner

local prix_charge_VE = 2714 --idx du device virtual tarif charge VE
local compteur_elec = 'Compteur_Conso_Exterieur' --nom du compteur_elec
local prix_kwh = '0.188237'

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- for PI



function round(num, dec)
   if num == 0 then
	 return 0
   else
	 local mult = 10^(dec or 2)
	 return math.floor(num * mult + 0.5) / mult
   end
end



commandArray = {}





-- L'appel et l'enregistrement des donnees dans la variable jsonValeur

  config=assert(io.popen('/usr/bin/curl "http://192.168.0.20:8080/json.htm?type=command&param=getdevices&rid=2678"'))
  blocjson = config:read('*all')
  config:close()
  jsonValeur = json:decode(blocjson)

 data_day = jsonValeur..result[].CounterToday
print ('Conso_du_jour', data_day)


if (devicechanged[compteur_elec]) then
    
    -- Récupération des valeurs du compteur 
    p1, p2 = string.match(otherdevices_svalues[compteur_elec], "(%d+.%d*);(%d+.%d*)")

    --data_day = domoticz.devices('Compteur_Conso_VE').counterToday 
    print('P1', p1 )
    print('P2', p2 )
    
    -- Calcul du coût en euros
	prix_charge_VE = data_day * prix_kwh / 1000
	
    -- Arrondir le prix à 2 chiffres après la virgule
	prix_charge_VE  = round(prix_charge_VE, 2)
	
	-- Affichage du tarif pour vérification
	print('Tarif jour : ', prix_charge_VE)
	
	-- Mise à jour du dispositif virtuel
	commandArray[#commandArray+1]={['UpdateDevice'] = idx..'|0|'..prix_charge_VE} ---- mise a jour du device virtuel
end

return commandArray

Re: [LUA] Recuperer de compteur du jour dans une variable

Publié : 03 nov. 2024, 18:34
par Keros
Je vois la ligne avec deux points qui ne me semble pas normal data_day = jsonValeur..result[].CounterToday

Et tu as des erreurs quand tu exécutes ce script ?

Le print ('Conso_du_jour', data_day) donne la valeur que tu attends ?

Re: [LUA] Recuperer de compteur du jour dans une variable

Publié : 03 nov. 2024, 21:59
par Guigui
Les deux points dans normal data_day = jsonValeur..result[].CounterToday

sont une erreur de copie


Voici mes logs
2024-11-03 21:57:13.394 Error: EventSystem: in Cout_Charge_VE: [string "local prix_charge_VE = 2714 --idx du device v..."]:33: unexpected symbol near ']'
2024-11-03 21:57:18.461 Capteurs Locaux: General/Percentage (CPU_Usage @49)
2024-11-03 21:57:18.464 Error: EventSystem: in Cout_Charge_VE: [string "local prix_charge_VE = 2714 --idx du device v..."]:33: unexpected symbol near ']'

data_day = jsonValeur.result[].CounterToday ne fonctionne pas


et un data_day = jsonValeur.result.CounterToday me renvoi... rien :(

Re: [LUA] Recuperer de compteur du jour dans une variable

Publié : 03 nov. 2024, 22:34
par Keros
Tu peux nous mettre ici le résultat de l'appel API http://192.168.0.20:8080/json.htm?type= ... s&rid=2678 ?