Aller au contenu
Riniack

[Resolu] Problème de syntaxe LUA

Recommended Posts

Hello,

Cherchant à récupérer la température de consigne d'un panneau de chauffage de la HC2 dans un virtual device pour effectuer des actions j'ai une erreur de syntaxe. comme je débute en LUA, je butte après pas mal d'essais sans succès.

Le code :

HC2 = Net.FHttp("127.0.0.1",11111)
panel = api.get("/panels/heating/94")
If panel.properties.currentTemperature = 21 then
   fibaro:call(fibaro:getSelfId(), "pressButton", "3")
   fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Consigne.value", vartemp)
ElseIf panel.properties.currentTemperature = 18,5 then
   fibaro:call(fibaro:getSelfId(), "pressButton", "2")
   fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Consigne.value", vartemp)
End

 

L'erreur :

Line 4: '=' expected near 'panel'

 

Une idée ?

Modifié par Riniack
Resolu

Partager ce message


Lien à poster
Partager sur d’autres sites

je n'ai plus fait de lua depuis des années, et je sais qu'il y a eu de grosses modifications pour l'appel aux API.

Mais

tu as défini la variable HC2, puis tu ne l'utilises pas. Je pense que c'est là que se trouve le problème.

Modifié par jojo

Partager ce message


Lien à poster
Partager sur d’autres sites

Il aurait été pratique que tu dises à quoi correspond à ta ligne 4, car là on est obligé de deviner...

 

Jojo a partiellement raison, le HC2 ne sert à rien.... mais ce n'est pas ton problème

 

Tes tests if et elseif sont mal syntaxés, il faut mettre un double == pour comparer des valeurs.

Le simple = implique une affectation de valeur.

 

Il y a peut être d'autres bugs, mais celui là saute aux yeux.

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci à vous deux pour ces pistes. En effet des erreurs et j'en ai corrigé certaines.

En fait je me bats pour récupérer des valeurs du panneau de chauffage et à priori l'API à pas mal changé. le fait d'utiliser les 2 premières lignes vient d'un code retrouvé sur le forum fibaro directement.

Si je commente toute la boucle If, il n'y a pas d'erreur et je récupère bien la valeur de panel.properties.currentTemperature.

L'erreur ne semble donc pas provenir de cette partie du code. Ceci dit, en la mettant en commentaire, je récupère quand même la valeur.

Donc en résumé :

local panel = api.get("/panels/heating/94") -- 94 etant le numéro du panneau de chauffage qui m'intéresse pour cette pièce
fibaro:debug(panel.properties.currentTemperature) -- Retourne 21, donc la valeur du panneau
If panel.properties.currentTemperature == 21 then  --Test de la valeur de la température de consigne actuelle du panneau de chauffage n°94
      fibaro:call(fibaro:getSelfId(), "pressButton", "3") -- Actionne le bouton 3 (Confort) du virtual device de chauffage (celui où s'exécute actuellement ce code dans le Main)
      fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Consigne.value", panel.properties.currentTemperature) -- Mets à jour l'affichage de la température de consigne dans le virtual device
ElseIf panel.properties.currentTemperature == 18,5 then
      fibaro:call(fibaro:getSelfId(), "pressButton", "2")
      fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Consigne.value", panel.properties.currentTemperature)
End

Je présume que la valeur retournée pour la propriété panel.properties.currentTemperature est de type integer, malgré tout j'ai également fait des tests avec des conversions. J'ai toujours la même erreur et je pense qu'il s'agit de syntaxe ou de conversion. J'ai tenté les " et les ' autour de la valeur à tester, le problème reste identique (eg : panel.properties.currentTemperature == '21' then)

 

Modifié par Riniack
mise entre balise

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Mets ton code entre les balises <> ca simplifie la lecture stp. Cela se trouve dans le menu d'edition du message

PAs tout suivi, mais essaie avec tonumber()
 

if tonumber(panel.properties.currentTemperature) == 21 then

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Pepite pour l'astuce de balise.

En fait plus j'avance sur le sujet plus je doute.

Je nettoie le code et commente pour limiter les erreurs et j'en suis ici :

local panel = api.get("/panels/heating/94") -- 94 etant le numéro du panneau de chauffage qui m'intéresse pour cette pièce
local vTemp = tonumber(panel.properties.currentTemperature)-- Conversion de la valeur retournée en Nombre
local idDevice = fibaro:getSelfId();-- Recupération de l'id du Virtual device
fibaro:debug(vTemp); -- Retourne 21
fibaro:debug(idDevice);-- Retourne 115

If (vTemp > 21) then
  --fibaro:call(idDevice, "pressButton", "3")
  --fibaro:call(idDevice, "setProperty", "ui.Consigne.value", vTemp);
--ElseIf vTemp == 18,5 then
  	--fibaro:call(idDevice, "pressButton", "2")
 	--fibaro:call(idDevice, "setProperty", "ui.Consigne.value", vTemp)
End

En gros même sans rien faire, le test If échoue sur une erreur : line 7: unexpected symbol near 'then'

Ce que je comprends encore moins, c'est le cas suivant : je créé un bouton dans un nouveau virtual device avec le code suivant pour voir :

If (1==1) Then
  fibaro:debug('Test');
End 

et j'ai aussi une erreur : line 2: '=' expected near 'fibaro'

Soit je suis une grosse quiche, ce qui n'est pas à exclure, soit j'ai un souci avec les Virtual Devices.

Partager ce message


Lien à poster
Partager sur d’autres sites

Et en écrivant "if", "then", "else", "elseif"... Bref sans lettre capitale, cela donne quoi ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Barelle, tu est un génie :-)

C'était bien cela le problème

Partager ce message


Lien à poster
Partager sur d’autres sites

Well done, je n'avais pas remarqué que tu avais mis des majuscules ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

×