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 <\>.
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 »

comme je te l'ai presenté, c'est l'ensemble des ordres qui est passé en revu.
comment reconnaître dans une conversation ce qui est un ordre de ce qui ne l'ai pas? je n'ai pas la réponse
mais si tu décompose le contenu de ta variable avec une fonction genre

Code : Tout sélectionner

function split(s, delimiter)
    result = {};
    for match in (s..delimiter):gmatch("(.-)"..delimiter) do
        table.insert(result, match);
    end
    return result;
end

cela va te donner l'ensemble des mots contenu dans ta variable que tu va pouvoir comparer à tes ordres

Code : Tout sélectionner

s = split(uservariables["zappingtele"], " ")
 for key, value in pairs(s) do
    print(key..'='..value)
end
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 »

ok merci je regarde dans la soirée.
Edit: Voila ou j'en suis

Code : Tout sélectionner

function split(s, delimiter)
    result = {};
    for match in (s..delimiter):gmatch("(.-)"..delimiter) do
        table.insert(result, match);
    end
    return result;
end

s = split(uservariables["zappingtele"], " ")
 for key, value in pairs(s) do
    print(key..'='..value)
    for n,device in pairs(devices) do
    if string.find(value, devices[n][1]) then
    log('je fais '..device[2],debug)
    end
end
end
C'est nickel. Merci pour la piste papoo. Il me reste juste à modifier mes ordres pour ne pas avoir de redondances car la sélection se fait sur un seul mot clé.
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 »

Voici le script qui tourne depuis ce soir. Encore merci à papoo et chrominator pour m'avoir aiguillé sur la manière de filtrer le contenu d'une variable de type chaîne.

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 mettent à 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 = true  -- 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 des requetes qui ne sont numériques dans la variable zappingtele
devices[#devices+1] = {'baisse', 'VolumeDown'}
devices[#devices+1] = {'monte', 'VolumeUp'}
devices[#devices+1] = {'plus', 'ChannelUp'}
devices[#devices+1] = {'moins', 'Channeldown'}
devices[#devices+1] = {'précédente', 'ChannelPrev'}
devices[#devices+1] = {'coupe le son', 'Mute'}
devices[#devices+1] = {'sortir', 'Exit'}
devices[#devices+1] = {'bas', 'DirectionDown'}
devices[#devices+1] = {'droite', 'DirectionRight'}
devices[#devices+1] = {'gauche', 'DirectionLeft'}
devices[#devices+1] = {'haut', 'DirectionUp'}
devices[#devices+1] = {'guide', 'Guide'}
devices[#devices+1] = {'info', 'Info'}
devices[#devices+1] = {'ok', 'Ok'}
devices[#devices+1] = {'tf1', '1'}
devices[#devices+1] = {'une', '1'}
devices[#devices+1] = {'france2', '2'}
devices[#devices+1] = {'france3', '3'}
devices[#devices+1] = {'france4', '63'}
devices[#devices+1] = {'france5', '5'}
devices[#devices+1] = {'arte', '5'}
devices[#devices+1] = {'canal', '4'}
devices[#devices+1] = {'canal+', '4'}
devices[#devices+1] = {'m6','6'}
devices[#devices+1] = {'breizh', '53'}
devices[#devices+1] = {'sister', '67'} --chaine 6ter
devices[#devices+1] = {'6ter', '67'} --chaine 6ter
devices[#devices+1] = {'hd1', '66'}
devices[#devices+1] = {'infosport', '120'}
devices[#devices+1] = {'eurosport1', '121'}
devices[#devices+1] = {'eurosport2', '122'}
devices[#devices+1] = {'équipe', '137'} --chaine l'équipe 21
devices[#devices+1] = {'infosport', '120'}
devices[#devices+1] = {'suivante', '120'}
devices[#devices+1] = {'sans', '100'}
devices[#devices+1] = {'météo', '100'}
--fin du tableau

commandArray = {} 

if (uservariables["zappingtele"] ~='0') then
function split(s, delimiter)
    result = {};
    for match in (s..delimiter):gmatch("(.-)"..delimiter) do
        table.insert(result, match);
    end
    return result;
end

s = split(uservariables["zappingtele"], " ") --découpe la variable à chaque espace pour ensuite trier par rapport aux ordres
    for key, value in pairs(s) do
    log(key..'='..value,debug)
        
   if(string.find(uservariables["zappingtele"],"eurosport") ~= nil or string.find(uservariables["zappingtele"],"france") ~= nil) then  --on commence par le traitement des chaines eurosports et france tv ( à cause de france 4)      
       if(tonumber(value)~=nill) then
       numero = tonumber(value)           
            if(string.find(uservariables["zappingtele"],"eurosport") ~= nil) then 
            chaine = ('eurosport'..numero)
            log('chaine demandée1 '..chaine,debug)         
            elseif (string.find(uservariables["zappingtele"],"france") ~= nil) then 
            chaine = ('france'..numero)
            log('chaine demandée2 '..chaine,debug)
            end
            for n,device in pairs(devices) do 
            if string.find(chaine, devices[n][1]) then
            action = device[2]
            end
            end
            end 

        elseif (tonumber(value)~=nil and string.find(uservariables["zappingtele"],"eurosport") == nil and string.find(uservariables["zappingtele"],"france") == nil ) then  --on continu avec les chaînes demandées par leurs numéros
        action = tonumber(value)  
        log('chaine demandée3 '..action,debug)

        elseif (tonumber(value)==nil) then --on termine par les demandes des chaines par le nom (sauf eurosport et france tv) et toutes les autres demande qui ne sont pas des chaînes.   
            for n,device in pairs(devices) do 
            if string.find(value, devices[n][1]) then
            action = device[2]     
            log('chaine ou action demandée'..action,debug)
            end
            end
        end
    end

    if(action == nil)then --on traite toutes les commandes qui ne sont par reconnues dans le tableau
    log('Action zapping non reconnue',debug)
    commandArray[#commandArray + 1]={['Variable:zappingtele']='0'} --efface la commande non reconnue
    return commandArray	
    end

    log('Action à faire '..action,debug) 
    if (tonumber (action) ~= nil) then --on commence par s'occuper des demandes de chaînes
        local chainecentaine = math.floor(tonumber(action)/100,0.9)
        local chainedizaine = math.floor((tonumber(action) - (math.floor(tonumber(action)/100,0.9)*100 ))/10,0.9) 
        local chaineunite = tonumber(action) - math.floor(tonumber(action)/100,0.9)*100 - math.floor((tonumber(action) - (math.floor(tonumber(action)/100,0.9)*100 ))/10,0.9)*10
        if (chainecentaine == 0 and chainedizaine == 0) then --chaines à 1 chiffre
	    os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adresse mail' 'password' 'IpHamonyHub' issue_device_command 27244186 "'..chaineunite..'"')
        elseif (chainecentaine == 0 and chainedizaine > 0) then --chaines à 2 chiffre
        os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adresse mail' 'password' 'IpHamonyHub' issue_device_command 27244186 "'..chainedizaine..'"')
	    os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adresse mail' 'password' 'IpHamonyHub' issue_device_command 27244186 "'..chaineunite..'"')
        elseif (chainecentaine > 0) then --chaines à 3 chiffres
        os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adresse mail' 'password' 'IpHamonyHub' issue_device_command 27244186 "'..chainecentaine..'"')
	    os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adresse mail' 'password' 'IpHamonyHub' issue_device_command 27244186 "'..chainedizaine..'"')
	    os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adresse mail' 'password' 'IpHamonyHub' issue_device_command 27244186 "'..chaineunite..'"')
        end
    elseif (tonumber (action) == nil) then --on continu avec toutes les demandes qui ne sont pas une chaine
        if (action == 'VolumeUp') then --commande spéciale pour le son où on veut doubler la commande
        os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adresse mail' 'password' 'IpHamonyHub' issue_device_command 27244186 "VolumeUp"')
        os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adresse mail' 'password' 'IpHamonyHub' issue_device_command 27244186 "VolumeUp"')     
        elseif (action == 'VolumeDown') then --commande spéciale pour le son où on veut doubler la commande
        os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adresse mail' 'password' 'IpHamonyHub' issue_device_command 27244186 "VolumeDown"')
        os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adresse mail' 'password' 'IpHamonyHub' issue_device_command 27244186 "VolumeDown"')        
        end
        os.execute('/home/pi/HarmonyHubControl/HarmonyHubControl 'adresse mail' 'password' 'IpHamonyHub' issue_device_command 27244186 "'..action..'"')
    end
end
commandArray[#commandArray + 1]={['Variable:zappingtele']='0'} --variable pour éviter le zapping quand d'autres variables changent	
return commandArray 
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