canalsat, recherche d'un mot dans une variable

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 <\>.
thier
Messages : 807
Inscription : 26 sept. 2015, 10:32
Localisation : charente

canalsat, recherche d'un mot dans une variable

Message 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.
Dernière modification par thier le 03 janv. 2018, 22:42, modifié 1 fois.
PI3+, Buster, Domoticz V2020.2, rflink, zwave, chauffage piloté par qubino, sondes oregon et Vil1d, boite aux lettres détection passage facteur, volets roulants qubino fibaro.
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

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

Message par Chrominator »

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
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

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

Message 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 :)
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
thier
Messages : 807
Inscription : 26 sept. 2015, 10:32
Localisation : charente

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

Message 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.
PI3+, Buster, Domoticz V2020.2, rflink, zwave, chauffage piloté par qubino, sondes oregon et Vil1d, boite aux lettres détection passage facteur, volets roulants qubino fibaro.
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

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

Message 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
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

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

Message 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
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
thier
Messages : 807
Inscription : 26 sept. 2015, 10:32
Localisation : charente

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

Message par thier »

Vous allez trop vite pour moi. Je continu à gratter et je reviens...
PI3+, Buster, Domoticz V2020.2, rflink, zwave, chauffage piloté par qubino, sondes oregon et Vil1d, boite aux lettres détection passage facteur, volets roulants qubino fibaro.
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

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

Message 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
Dernière modification par papoo le 02 janv. 2018, 19:33, modifié 1 fois.
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
thier
Messages : 807
Inscription : 26 sept. 2015, 10:32
Localisation : charente

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

Message 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.
PI3+, Buster, Domoticz V2020.2, rflink, zwave, chauffage piloté par qubino, sondes oregon et Vil1d, boite aux lettres détection passage facteur, volets roulants qubino fibaro.
thier
Messages : 807
Inscription : 26 sept. 2015, 10:32
Localisation : charente

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

Message 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.
PI3+, Buster, Domoticz V2020.2, rflink, zwave, chauffage piloté par qubino, sondes oregon et Vil1d, boite aux lettres détection passage facteur, volets roulants qubino fibaro.
Répondre