[LUA] message erreur global 'uservariables'
Publié : 23 août 2022, 14:11
Bonjour à tous,
Tout d'abord, je débute ! Alors merci de votre patience.
J'ai fait de la programmation dans mon jeune temps mais c'était du C, du C++. Mais je pense ne pas être trop mal cablé pour comprendre le LUA !
Je commence mon premier ecript LUA en me référent à quelques lectures sur internet ainsi que sur les 3 articles de ce site sur LUA. Mais je sens qu'il me manque beaucoup de connaissances pour avancer. Et je ne trouve pas de tuto plus complets sur le LUA dans Domoticz et ça me parait surprenant.
Avant toute chose, je passe par LUA parce que c'est ce qui me semble le plus logique mais peut-être allez-vous me conseiller autre chose. Je suis ouvert !
Mon projet n'est pas un sujet nouveau mais je m'en sers surtout pour comprendre les scripts.
A ce stade, je souhaite savoir si j'ai assez d'eau dans une cuve pour lancer un arrosage.
J'ai créé :
Arrosage_Actif : device fictif de type swith On/Off qui me permet de définir si je veux lancer les programmes d'arrosage ou non.
Water_Tank_Hauteur : device réel qui récupère la hauteur d'eau dans ma cuve (via capteur ultra son)
water_tank : user variable de type string qui contiendra OK ou KO selon qu'il y a assez d'eau pour un arrosage ou pas
water_tank_hauteur_courante de type float qui récupèrera la valeur du device Water_Tank_Hauteur (ça fait peut-être doublon)
water_tank_hauteur_mini de type float qui contient la hauteur mini en deça de laquelle je ne veut pas arroser
Dans mon premier script, je souhaite initialiser la variable utilisateur water_tank à OK ou KO.
Si water_tank_hauteur_courante>water_tank_hauteur_mini alors water_tank = OK sinon water_tank = KO
Ca ne me semble pas compliqué mais pourtant...
Voilà mon script :
// A noter que je teste provisoirement la valeur du device 'Arrosage_Actif' pour tester mon script. A terme, je testerai le changement de Water_Tank_Hauteur .
// J'ai également mis des print partout pour le debogage
Je récupère le message suivant dans mon log
EventSystem: in /home/pi/domoticz/scripts/lua/script_device_water_tank_ok.lua: .../pi/domoticz/scripts/lua/script_device_water_tank_ok.lua:16: attempt to call a table value (global 'uservariables')
Cela correspond au code
J'ai essayé de retirer le tonumber mais ça ne change rien.
A noter par la même occasion que même en retirant le code "print" générant cette erreur, ma variable utilisateur water_tank_hauteur_courante n'et pas initialisée par mon device Water_Tank_Hauteur comme le voudrait la commande
De bonnes âmes pour m'aider ? Je suis preneur de toutes vos remarques !
Tout d'abord, je débute ! Alors merci de votre patience.
J'ai fait de la programmation dans mon jeune temps mais c'était du C, du C++. Mais je pense ne pas être trop mal cablé pour comprendre le LUA !
Je commence mon premier ecript LUA en me référent à quelques lectures sur internet ainsi que sur les 3 articles de ce site sur LUA. Mais je sens qu'il me manque beaucoup de connaissances pour avancer. Et je ne trouve pas de tuto plus complets sur le LUA dans Domoticz et ça me parait surprenant.
Avant toute chose, je passe par LUA parce que c'est ce qui me semble le plus logique mais peut-être allez-vous me conseiller autre chose. Je suis ouvert !
Mon projet n'est pas un sujet nouveau mais je m'en sers surtout pour comprendre les scripts.
A ce stade, je souhaite savoir si j'ai assez d'eau dans une cuve pour lancer un arrosage.
J'ai créé :
Arrosage_Actif : device fictif de type swith On/Off qui me permet de définir si je veux lancer les programmes d'arrosage ou non.
Water_Tank_Hauteur : device réel qui récupère la hauteur d'eau dans ma cuve (via capteur ultra son)
water_tank : user variable de type string qui contiendra OK ou KO selon qu'il y a assez d'eau pour un arrosage ou pas
water_tank_hauteur_courante de type float qui récupèrera la valeur du device Water_Tank_Hauteur (ça fait peut-être doublon)
water_tank_hauteur_mini de type float qui contient la hauteur mini en deça de laquelle je ne veut pas arroser
Dans mon premier script, je souhaite initialiser la variable utilisateur water_tank à OK ou KO.
Si water_tank_hauteur_courante>water_tank_hauteur_mini alors water_tank = OK sinon water_tank = KO
Ca ne me semble pas compliqué mais pourtant...
Voilà mon script :
// A noter que je teste provisoirement la valeur du device 'Arrosage_Actif' pour tester mon script. A terme, je testerai le changement de Water_Tank_Hauteur .
// J'ai également mis des print partout pour le debogage
Code : Tout sélectionner
print('Entrée dans la script Water_Tank_OK')
commandArray = {}
if (devicechanged['Arrosage_Actif']) then
print('if 1')
commandArray['Variable:water_tank_hauteur_courante']=tostring((otherdevices_svalues['Water_Tank_Hauteur']))
if (uservariables['water_tank_hauteur_courante'])>(uservariables['water_tank_hauteur_mini']) then
print('if 2')
uservariables['water_tank']=OK
print("Hauteur de cuve = "..(otherdevices_svalues['Water_Tank_Hauteur']))
print("valeur water_tank = "..tonumber(uservariables('water_tank')))
else
print('else 2')
uservariables["water_tank"]=KO
print("Hauteur de cuve = "..tonumber((otherdevices_svalues['Water_Tank_Hauteur'])))
print("valeur water_tank = "..tonumber(uservariables('water_tank')))
end
else
print('pas de changement detecté')
end
return commandArray
EventSystem: in /home/pi/domoticz/scripts/lua/script_device_water_tank_ok.lua: .../pi/domoticz/scripts/lua/script_device_water_tank_ok.lua:16: attempt to call a table value (global 'uservariables')
Cela correspond au code
Code : Tout sélectionner
print("valeur water_tank = "..tonumber((uservariables('water_tank'))))A noter par la même occasion que même en retirant le code "print" générant cette erreur, ma variable utilisateur water_tank_hauteur_courante n'et pas initialisée par mon device Water_Tank_Hauteur comme le voudrait la commande
Code : Tout sélectionner
commandArray['Variable:water_tank_hauteur_courante']=tostring((otherdevices_svalues['Water_Tank_Hauteur']))