[LUA] Recuperer de compteur du jour dans une variable

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 <\>.
Guigui
Messages : 86
Inscription : 12 sept. 2015, 16:19

[LUA] Recuperer de compteur du jour dans une variable

Message 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
Dernière modification par Keros le 02 nov. 2024, 21:13, modifié 1 fois.
Raison : Ajout les balises pour les logs. Merci de lire la section Bien utiliser le forum
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

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

Message par denis_brasseur »

Tu mélanges LUA et DzVents
commandArray = {} : c'est du LUA
domoticz.devices('Compteur_Conso_VE').counterToday : c'est du DzVents
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Guigui
Messages : 86
Inscription : 12 sept. 2015, 16:19

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

Message 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)
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message 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.
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
Guigui
Messages : 86
Inscription : 12 sept. 2015, 16:19

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

Message par Guigui »

Parser le json ne fonctionne pas

jsonValeur.result


me retourne un null.

Mais j'avance =)
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message 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).
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
Guigui
Messages : 86
Inscription : 12 sept. 2015, 16:19

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

Message 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
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message 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 ?
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
Guigui
Messages : 86
Inscription : 12 sept. 2015, 16:19

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

Message 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 :(
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

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