Page 1 sur 2

canalsat, recherche d'un mot dans une variable

Publié : 02 janv. 2018, 17:59
par thier
Tout d'abord bonne année à tous.
J'ai domotisé mon décodeur canalsat pour faire une commande vocale. J'utilise 'ok google' sur un téléphone dédié qui avec tasker fait un get http vers domoticz pour mettre à jour une variable zappingtele qui va contenir ma demande. Tout fonctionne bien, j'ai accès à l'intégralté des commandes et des chaines, mais le problème c'est que la commande doit correspondre exactement aux ordres de mon script. Je souhaiterai l'assouplir en faisant une recherche de mots clés dans ma variable zappingtele.
Je sais faire un string.find(uservariables["zappingtele"],'m6'). Je ne trouve pas comment remplacer 'm6' par une recherche dans ma table qui contient mes ordres. Je post le début du script pour essayer que ce soit plus compréhensible

Code : Tout sélectionner

local devices = {}
-- tableau à renseigner {'ordre', 'commande harmony'}.
devices[1] = {'baisse le volume', 'VolumeDown'}
devices[2] = {'monte le volume', 'VolumeUp'}
devices[3] = {'chaîne plus', 'ChannelUp'}
devices[4] = {'chaîne moins', 'ChannelUp'}

--fin du tableau
commandArray = {}

    if (uservariables["zappingtele"] ~='0') 
    for n,device in pairs(devices) do
C'est là que je voudrais savoir si la variable zappingtele contient 'baisse le volume' ou 'monte le volume' ou...(mon tableau à 35 entrées).
Au passage je pourrai mettre mon script si ça intéresse quelqu’un.

Re: canalsat, recherche d'un mot dans une variable

Publié : 02 janv. 2018, 18:14
par Chrominator

Re: canalsat, recherche d'un mot dans une variable

Publié : 02 janv. 2018, 18:16
par papoo
bonjour,
clairement il serait plus facile de savoir ce qu'il manque avec le script complet
pour le reste Chrominator a déjà répondu :)

Re: canalsat, recherche d'un mot dans une variable

Publié : 02 janv. 2018, 18:29
par thier
voici le script complet. c'est un script_variable.
J'ai oublié de dire que c'est un Harmony Hub qui fait la passerelle entre domoticz et canalsat

Code : Tout sélectionner

--[[
- script qui gére le décodeur canalsat
- nécessite une variable de type chaîne nommée zappingtele. les requêtes http mètent à jours cette variable qui déclenche ce script à chaque mise à jours.
pour les requêtes get http le type de uservariable est donné en dessous
uservariabletype = le type de valeur à stocker, entre 0 et 4 :
0 = Entier, e.g. -1, 1, 0, 2, 10 
1 = Float, e.g. -1.1, 1.2, 3.1
2 = chaine, ex coucou
3 = Date au format DD/MM/YYYY
4 = Heure au format 24hr HH:MM

la forme de la requête est domoticzIp/json.htm?type=command&param=updateuservariable&idx=idx&vname=uservariablename&vtype=uservariabletype&vvalue=uservariablevalue
]]--
dofile('/home/pi/domoticz/scripts/lua/modules.lua')
local debug = false  -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir

local devices = {}
-- tableau à renseigner {'ordre', 'commande harmony'}. Ceux sont les requêtes qui ne sont pas numériques dans la variable zappingtele
devices[1] = {'baisse le volume', 'VolumeDown'}
devices[2] = {'monte le volume', 'VolumeUp'}
devices[3] = {'chaîne plus', 'ChannelUp'}
devices[4] = {'chaîne moins', 'ChannelUp'}
devices[5] = {'chaîne précédente', 'ChannelPrev'}
devices[6] = {'coupe le son', 'Mute'}
devices[7] = {'sortir', 'Exit'}
devices[8] = {'flèche vers le bas', 'DirectionDown'}
devices[9] = {'flèche vers la droite', 'DirectionRight'}
devices[10] = {'flèche vers la gauche', 'DirectionLeft'}
devices[11] = {'flèche vers le haut', 'DirectionUp'}
devices[12] = {'guide', 'Guide'}
devices[13] = {'info', 'Info'}
devices[14] = {'ok', 'Ok'}
devices[15] = {'tf1', '1'}
devices[16] = {'france 2', '2'}
devices[17] = {'france 3', '3'}
devices[18] = {'france 4', '4'}
devices[19] = {'france 5', '5'}
devices[20] = {'arte', '5'}
devices[21] = {'canal', '4'}
devices[22] = {'canal+', '4'}
devices[23] = {'canal +', '4'}
devices[24] = {'m 6', '6'}
devices[25] = {'tv breizh', '53'}
devices[26] = {'sister', '67'}
devices[27] = {'hd1', '66'}
devices[28] = {'infosport', '120'}
devices[29] = {'eurosport 1', '121'}
devices[30] = {'eurosport 2', '122'}
devices[31] = {'équipe tv', '137'}
devices[32] = {'info sport', '120'}
devices[33] = {'chaîne suivante', 'ChannelUp'}
devices[34] = {'sans', '100'}
devices[35] = {'m6','6'}
--fin du tableau
commandArray = {}
if (uservariables["zappingtele"] ~='0' and tonumber(uservariables["zappingtele"]) == nill) then -- pour commencer on s'occupe des requêtes qui ne sont pas numériques dans la variable zappingtele

    for n,device in pairs(devices) do
        if (uservariables["zappingtele"] == (device[1])) then
            if (tonumber(device[2]) ~= nill) then --on s'occupe d'abord des valeurs qui sont numériques en device[2] (cas de la demande d'une chaine par le nom)
 	            --pour les chaines de 0 à 9
                if (tonumber(device[2])  <10) then 
                local chaine = tonumber(device[2]) 
	            os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chaine..'"')
	            log('je mets la '..chaine,debug)
    
                --pour les chaines de 10 à 99
                elseif (tonumber(device[2]) > 9 and tonumber(device[2]) < 100) then
                local chainedizaine = math.floor(tonumber(device[2])/10,0.9) 
                local chaineunite = tonumber(device[2])-( math.floor(tonumber(device[2])/10,0.9)*10)
                log('chaine demandée entre 10 et 99. Dizaine= '..chainedizaine..' unités= '..chaineunite,debug)
	            os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chainedizaine..'"')
	            os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chaineunite..'"')

                --pour les chaines de 100 à 999
                elseif (tonumber(device[2]) > 99 and tonumber(device[2]) < 1000) then
                local chainecentaine = math.floor(tonumber(device[2])/100,0.9)
                local chainedizaine = math.floor((tonumber(device[2]) - (math.floor(tonumber(device[2])/100,0.9)*100 ))/10,0.9) 
                local chaineunite = tonumber(device[2]) - math.floor(tonumber(device[2])/100,0.9)*100 - math.floor((tonumber(device[2]) - (math.floor(tonumber(device[2])/100,0.9)*100 ))/10,0.9)*10
                log('chaine demandée entre 100 et 990. Centaine= '..chainecentaine..' Dizaine= '..chainedizaine..' unités= '..chaineunite,debug)
	            os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chainecentaine..'"')
	            os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chainedizaine..'"')
	            os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chaineunite..'"')
                end--fin du traitement des requêtes numériques
            break        
            --ensuite on s'occupe des requêtes qui ne sont pas numérique en device[2]
            elseif( uservariables["zappingtele"] == 'monte le volume') then  --cas particulier du volume ou on veut deux ordres de suite          
            os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..device[2]..'"')
            os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..device[2]..'"')         
            log('je fais '..device[2],debug)
            elseif( uservariables["zappingtele"] == 'baisse le volume') then  --cas particulier du volume ou on veut deux ordres de suite          
            os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..device[2]..'"')
            os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..device[2]..'"')        
            log('je fais '..device[2],debug)
            else --toutes les requêtes qui ne sont pas numérique en device[2] et qui ne sont pas pour le volume
            os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..device[2]..'"')
            log('je fais '..device[2],debug)
            break            
            end
        end 
   
    commandArray[#commandArray + 1]={['Variable:zappingtele']='0'} --variable pour éviter le zapping quand d'autres variables changent	
end
end
if (uservariables["zappingtele"] ~='0' and tonumber(uservariables["zappingtele"]) ~= nill) then -- ensuite on s'occupe des requêtes qui sont numériques dans la variable zappingtele
    log('chaine demandée '..tonumber(uservariables["zappingtele"]),debug)

    --pour les chaines de 0 à 9
    if (tonumber(uservariables["zappingtele"])  <10) then  
    local chaine = tonumber(uservariables["zappingtele"]) 
	os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chaine..'"')
	log('je mets la '..chaine,debug)
    
    --pour les chaines de 10 à 99
    elseif (tonumber(uservariables["zappingtele"]) > 9 and tonumber(uservariables["zappingtele"]) < 100) then
    local chainedizaine = math.floor(tonumber(uservariables["zappingtele"])/10,0.9) 
    local chaineunite = tonumber(uservariables["zappingtele"])-( math.floor(tonumber(uservariables["zappingtele"])/10,0.9)*10)
    log('chaine demandée entre 10 et 99. Dizaine= '..chainedizaine..' unités= '..chaineunite,debug)
	os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chainedizaine..'"')
	os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chaineunite..'"')

--pour les chaines de 100 à 999
    elseif (tonumber(uservariables["zappingtele"]) > 99 and tonumber(uservariables["zappingtele"]) < 1000) then
    local chainecentaine = math.floor(tonumber(uservariables["zappingtele"])/100,0.9)
    local chainedizaine = math.floor((tonumber(uservariables["zappingtele"]) - (math.floor(tonumber(uservariables["zappingtele"])/100,0.9)*100 ))/10,0.9) 
    local chaineunite = tonumber(uservariables["zappingtele"]) - math.floor(tonumber(uservariables["zappingtele"])/100,0.9)*100 - math.floor((tonumber(uservariables["zappingtele"]) - (math.floor(tonumber(uservariables["zappingtele"])/100,0.9)*100 ))/10,0.9) * 10
    log('chaine demandée entre 100 et 990. Centaine= '..chainecentaine..' Dizaine= '..chainedizaine..' unités= '..chaineunite,debug)
	os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chainecentaine..'"')
	os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chainedizaine..'"')
	os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chaineunite..'"')
    end
    commandArray[#commandArray + 1]={['Variable:zappingtele']='0'} --variable pour eviter le zapping quand d'autres variables changent	
end
return commandArray
Chrominator, j’avais déjà vu ce post mais je ne m'en suis pas sortie. J'y retourne de nouveau.

Re: canalsat, recherche d'un mot dans une variable

Publié : 02 janv. 2018, 18:52
par papoo
je ne sais pas si cela t'aidera mais j'aurais structuré le tableau devices comme cela :

Code : Tout sélectionner

devices[#devices+1] = {ordre="mon ordre", commande="ma commande"}
l'avantage de devices[#devices+1] c'est de ne plus avoir à renumeroter les lignes pour qu'elles se suivent, du coup tu peux commenter n'importe quelle ligne sans que cela fasse de trou.
ensuite l'utilité d'ordonner chaque ordre et chaque commande permet de ne faire une recherche que dans les ordres
et ne rechercher que l'a commande ad hoc

Code : Tout sélectionner

for k,v in pairs(devices) do 
ordre = v.ordre
commande = v.commande
end
du coup ta recherche devient plus simple (à inclure dans le for bien sur)

Code : Tout sélectionner

if (uservariables["zappingtele"] == ordre)) then
 os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..commande..'"')
 end
ce qui donne

Code : Tout sélectionner

for k,v in pairs(devices) do 
ordre = v.ordre
commande = v.commande
    if (uservariables["zappingtele"] == ordre)) then
        os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..commande..'"')
    end
end

Re: canalsat, recherche d'un mot dans une variable

Publié : 02 janv. 2018, 18:58
par Chrominator
papoo a été le plus rapide, j'avais continué ton exemple :

Code : Tout sélectionner

local devices = {}
-- tableau à renseigner {'ordre', 'commande harmony'}.
devices[1] = {'baisse le volume', 'VolumeDown'}
devices[2] = {'monte le volume', 'VolumeUp'}
devices[3] = {'chaîne plus', 'ChannelUp'}
devices[4] = {'chaîne moins', 'ChannelUp'}
devices[5] = {'m6', 'la zapette à M6'}

for n,device in pairs(devices) do
   if string.find('m6', devices[n][1]) then   -- On compare l'ordre avec l'un des postes du tableau
      print("Reçu l'ordre de zapper sur "..devices[n][1]..". Ordre "..devices[n][2].." envoyé !")
   end
end

Re: canalsat, recherche d'un mot dans une variable

Publié : 02 janv. 2018, 19:04
par thier
Vous allez trop vite pour moi. Je continu à gratter et je reviens...

Re: canalsat, recherche d'un mot dans une variable

Publié : 02 janv. 2018, 19:10
par papoo
pour continuer je rajouterai dans device une troisieme infos qui permettrai de savoir simplement si il s'agit d'une commande (volume par exemple) d'un numero de chaine
exemple :

Code : Tout sélectionner

devices[#devices+1] = {ordre="m 6", commande="6", chaine=true}
ou

Code : Tout sélectionner

devices[#devices+1] = {ordre="baisse le volume", commande="VolumeDown", chaine=false}
couplé à une fonction pour décomposer le numéro de chaîne ça te donnerai un truc du genre

Code : Tout sélectionner

for k,v in pairs(devices) do 
ordre = v.ordre
commande = v.commande
chaine = v.chaine
    if (uservariables["zappingtele"] == ordre) and chaine == false then
        os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..commande..'"')
    elseif (uservariables["zappingtele"] == ordre) and chaine == true then
DecomposeChaine(commande)
	if chainecentaine ~= nil then
               os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chainecentaine..'"')
               elseif chainedizaine ~= nil then
               os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chainedizaine..'"')
               elseif chaineunite~= nil then
               os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adressemail' 'password' 'ipHarmony' issue_device_command 27244186 "'..chaineunite..'"')
               end
end
end

Re: canalsat, recherche d'un mot dans une variable

Publié : 02 janv. 2018, 19:26
par thier
@papoo
déjà merci pour devices[#devices+1]. Je ne connaissais que pour commandeArray. C'est adopté.
J'ai testé ta solution qui est une façon différente d'indexer les ordres et commandes. Par contre le problème final est le même. Il faut une correspondance parfaite entre la variable zappingtele et le tableau. Ce que je cherche à faire c'est par exemple dans une variable qui contient ' blablabla je monte le volume', identifier l'ordre 'monte le volume' pour ensuite faire l'action qui va bien.
@chrominator
if string.find('m6', devices[n][1]) then. Ce n'est pas 'm6' qu'il faudrait chercher mais l'ensemble de mes ordres jusqu'à trouver la correspondance.
Merci à vous deux de m'aider.

Re: canalsat, recherche d'un mot dans une variable

Publié : 02 janv. 2018, 19:40
par thier
L'optimisation de la composition des numéro des chaines viendra après. J'y ai déjà réfléchie en conservant if (tonumber(device[2]) ~= nill) pour savoir si la requête est un numéro. Par contre je peux regrouper sans me soucier de la chaîne demandée puisque le décodeur accepte les numéros commençant par 0 et 00. je les traiterai peut-être toutes à 3 chiffres.