travailler une variable chaine ?

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 <\>.
alexbi
Messages : 123
Inscription : 29 nov. 2015, 16:36

travailler une variable chaine ?

Message par alexbi »

bonjour,

je commence par prévenir que mon niveau en LUA est limité surtout quand on commence a perler de fonction etc ...
Après plusieur de recherche je m'avoue vaincu ...

je cherche à contourner un problème, le voici :

J'utilise mon google home et IFTTT pour mettre a jour une variable "domoticz". Cette variable va donc prendre la valeur (chaine) de ma commande vocale, exemple : 'allume les lumières du salon'. J'utilise déjà du LUA avec beaucoup de si je dis tel phrases alors ou tels phrase ou tel ... Bref c'est long est pas toujours sure que ma commande sera bien celle que j'ai écrite dans mon script LUA...

Je souhaiterais donc utiliser un système de mots clés (idée venue du fait que j'utilise Tasker sur mon tel et que j'ai découvert le site dialoflow), par exemple dans ma phrase je vais détecter si je trouve le mot 'allumer' ou 'allume' ou 'active' et si il est détecté alors je vais chercher le nom de mon actionneur ici 'lumières du salon' puis j'effectue l'action.

rechercher un mot dans une chaine, j'ai trouvé cette méthode :

Code : Tout sélectionner

commandArray = {}

local y = 'active'
local z = 'allumer'
local x = 'power_on' 


s = 'je veux allumer la lumière'

a = string.find(s, z)
print(a)
b = string.find(s, y)
print(b)
c = string.find(s, x)
print(c)

if a ~= nil or b ~= nil or c ~= nil then
print('ok')
end

return commandArray
bon vous l'aurez compris ma méthode est niveau débutant...

j'ai trouvé d'autres méthode comme séparer ma chaine en plusieurs mots mais le problème c'est que ne sais pas comment utiliser ce mots séparément ou

exemple :

Code : Tout sélectionner

local example = "an example string"
for i in string.gmatch(example, "%S+") do
   print(i)
end

-- output:
-- an
-- example
-- string
comment récupérer les différentes valeur de i séparément pour les utiliser par la suite ?

je vous laisse m'aiguiller vers la bonne voie car je rame un peu trop :roll:
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

Re: travailler une variable chaine ?

Message par Chrominator »

Je peux te proposer de mettre tout ça dans un tableau.
Ensuite tu peux passer en revue le tableau dans une boucle.

Exemple :

Code : Tout sélectionner

local commande = {"active", "allumer", "power_on"}
s = 'je veux allumer la lumière'

for i in pairs(commande) do
	if string.find(s, commande[i])then   -- On compare l'ordre avec l'un des postes du tableau
		print("J'ai l'ordre d'allumer")
	else
		print("C'est pas cela qu'on m'a demandé")
	end
end
Ce qui affiche :

C'est pas cela qu'on m'a demandé
J'ai l'ordre d'allumer
C'est pas cela qu'on m'a demandé
Un bon frein vaut mieux que deux sparadraps.

Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
alexbi
Messages : 123
Inscription : 29 nov. 2015, 16:36

Re: RE: Re: travailler une variable chaine ?

Message par alexbi »

Chrominator a écrit :Je peux te proposer de mettre tout ça dans un tableau.
Ensuite tu peux passer en revue le tableau dans une boucle.

Exemple :

Code : Tout sélectionner

local commande = {"active", "allumer", "power_on"}
s = 'je veux allumer la lumière'

for i in pairs(commande) do
	if string.find(s, commande[i])then   -- On compare l'ordre avec l'un des postes du tableau
		print("J'ai l'ordre d'allumer")
	else
		print("C'est pas cela qu'on m'a demandé")
	end
end
Ce qui affiche :

C'est pas cela qu'on m'a demandé
J'ai l'ordre d'allumer
C'est pas cela qu'on m'a demandé
ouaaa ça c'est une réponse qui va bien m'aider merci à toi. Je vais essayer de mieux comprendre le système de pairs car je vois qu'on l'utilise partout.

sinon tu ne sais pas si on peux couper une chaîne en deux ? en repérant un mot comme "et" par exemple pour pouvoir analyser les deux partie d'une phrase comme par exemple si je dis 'allume la lumière du salon 'et' éteins la lumière de la salle de bains'. Cela me donnerait deux chaîne 'allume la lumière' et une autre 'éteins la lumière de la salle de bain', que je pourrais ensuite analyser séparément avec la méthode de ton premier poste.

merci à toi pour ton aide


Envoyé de mon HUAWEI VNS-L31 en utilisant Tapatalk
alexbi
Messages : 123
Inscription : 29 nov. 2015, 16:36

Re: travailler une variable chaine ?

Message par alexbi »

bon
je crois que j'ai trouvé une réponse a ma question : comment couper une chaîne avec un mot repère, ici "et".

Code : Tout sélectionner

commandArray = {}

s = 'allume la lumière et fait moi un café'

nbLettre = #s          -- trouve nombre de caractères dans la phrase = 39
print(nbLettre)

local i, j = string.find( s, "%set%s" )  -- repère la position de "et" dans la phrase = de 19 à 22
print(i, j)


print(string.sub (s, 1, i-1))  -- donne la première partie de la phrase donc avant le "et" = allume la lumière

print(string.sub (s, j+1, nbLettre))  -- donne la deuxième partie de la phrase donc après le "et" = fait moi un café

return commandArray
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

Re: travailler une variable chaine ?

Message par Chrominator »

Nickel ! :)
Un bon frein vaut mieux que deux sparadraps.

Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
Répondre