Aller au contenu
eric_le_belge

LUA - Passer une chaine dans un tableau / fonction

Recommended Posts

Bonjour à tous,

 

Pour mon premier vrai script LUA j'ai créé un mini-module météo, et pour cela j'ai adapté des pépites trouvées sur le net pour créer l'équivalent d'une fonction CASE.

 

Le principe est simple, on passe 2 arguments, d'abord ce que l'on cherche, puis le tableau dans lequel on fait la recherche. Peu importe ce qui se trouve dans ce tableau, cela peut être une phrase (ici c'est le cas), une instruction à exécuter...

 

Cela fonctionne bien, mais je coince sur un truc. Lors de la création de mon tableau liste_meteo, tout fonctionne tant que je n'ai qu'un mot, un chiffre ou un caractère. Mais si j'essaie de mettre une phrase, ça bug. Ici le but est de traduire la météo anglaise en français, mais je bloque sur Mostly Cloudy. J'ai essayé avec guillemets, avec le symbole [], mais rien à faire.

 

 

Question bis: fibaro:debug est utile lors du debug, mais est-il possible d'afficher un message lors de l'exécution dans la petite fenêtre de 4 lignes en haut de l'interface web ?

 

--[[
%% autostart
%% properties
%% events
%% globals
--]]

local function switch(choix,listedechoix)
  -- accepte aussi bien les nombres que les caractères ou chaine en argument choix
  -- choix = élement recherché
  -- listedechoix: liste d'arguments construits selon l'exemple ci-dessous
  -- retour: chaine retour définie dans le tableau

  if listedechoix[choix] then
     listedechoix[choix]()
  else
     listedechoix["default"]()
  end

  return retour
end

local Jour = fibaro:getValue(1,"sunriseHour")
local Nuit = fibaro:getValue(1,"sunsetHour")
local Temperature = api.get('/weather')['Temperature']
local Conditions = api.get('/weather')['WeatherCondition']
local Humidite = api.get('/weather')['Humidity']
local Vent = api.get('/weather')['Wind']
local temin = ""
local meteo = ""
local min_temp = tonumber(fibaro:getGlobalValue('minimum_temp'))

local listemeteo = 
   {
    clear = function ( ) retour = "Dégagé" end,
  	cloudy = function ( ) retour = "Nuageux" end,
	--Mostly cloudy = function ( ) retour = "Très Nuageux" end,
  	rain = function ( ) retour = "Pluie" end,
  	default = function ( ) retour = Conditions end,
   };


-- -------------------------------------------------------------------------------
-- Code principal
-- -------------------------------------------------------------------------------
fibaro:debug("Mise à jour de la météo")
if (min_temp > tonumber(Temperature)) then
  fibaro:setGlobal('minimum_temp',tonumber(Temperature));
  min_temp = tonumber(Temperature);
end

-- mise en forme des résultats
temin = string.format("%2.1f",min_temp);
Temperature = string.format("%2.1f",Temperature);
Vent = string.format("%2.0f", Vent);

-- Traduction de la météo
meteo = switch(Conditions,listemeteo)

-- mise à jour des affichages
fibaro:call(fibaro:getSelfId(),"setProperty","ui.Leve.value",Jour);
fibaro:call(fibaro:getSelfId(),"setProperty","ui.Couche.value",Nuit);
fibaro:call(fibaro:getSelfId(),"setProperty","ui.Temp.value","Min "..temin.." / Actuelle "..Temperature.."°c");
fibaro:call(fibaro:getSelfId(),"setProperty","ui.Conditions.value",meteo);
fibaro:call(fibaro:getSelfId(),"setProperty","ui.Humidite.value",Humidite .. "%");
fibaro:call(fibaro:getSelfId(),"setProperty","ui.Vent.value",Vent .. "km/h");

-- mise en sommeil pour 30 minutes
fibaro:sleep(18000000);

 

En espérant avoir été clair...

 

Eric

Partager ce message


Lien à poster
Partager sur d’autres sites

Je me réponds à moi-même...

 

Voila le bon code

 

local listemeteo = 
   {
    clear = function ( ) retour = "Dégagé" end,
  	cloudy = function ( ) retour = "Nuageux" end,
	["Mostly Cloudy"] = function ( ) retour = "Très Nuageux" end,
  	rain = function ( ) retour = "Pluie" end,
  	default = function ( ) retour = Conditions end,
   };

 

Prochaine étape, remplacer le module météo par un appel externe, mais là faut que je potasse json...

Partager ce message


Lien à poster
Partager sur d’autres sites

je suis ton sujet, mais j‘ai du mal à comprendre ce que tu cherches à faire...

Partager ce message


Lien à poster
Partager sur d’autres sites

En globalité ou uniquement sur la fonction ?

 

Globalité c'est un Vd météo pas bien compliqué.

 

La fonction switch est simple:

 

tu construits un tableau avec tes éléments, et une ligne défaut.

tu appelles la fonction switch avec l'élement cherché et le tableau

Si l'élément est trouvé, switch retourne la valeur de la 2ème colonne du tableau, sinon switch retourne la valeur de défaut.

 

ici je traduis la météo en anglais vers le français.

Partager ce message


Lien à poster
Partager sur d’autres sites

ah oui ok je comprends maintenant.

 

PS : je mettrais partout les ["..."] pour les éléments de la liste, pour une question de lisibilité du code ;) 

 



Partager ce message


Lien à poster
Partager sur d’autres sites
Le 04/01/2020 à 17:14, eric_le_belge a dit :

est-il possible d'afficher un message lors de l'exécution dans la petite fenêtre de 4 lignes en haut de l'interface web ?

Bonjour,

 

Je ne sais plus vraiment pour la petite fenetre, mais t peux envoyer des notifications à la HC2

Regarde cela

 

Partager ce message


Lien à poster
Partager sur d’autres sites

×