Page 1 sur 2

[LUA] Renforcement du signal pour les interrupteurs sans état

Publié : 03 août 2016, 17:11
par fratton
Ce script permet de renvoyer les commandes à certain périphériques (par exemple les prises 433Mhz) après 60s et toutes les 30mn de sorte à fiabiliser leur fonctionnement (par exemple être sûr que le chauffage est allumé).

Installation :
1) Créer une variable utilisateur InterrupteursSansEtat et mettre les noms des interrupteurs séparés par un pipe "|".
exemple : Prise1|Prise2|Ma VMC|Prise4
Le script testera si le device existe (On ou Off) et créera la variable correspondante.

2) Créer un Script LUA de type TIME nommé RENFORCEMENT et changer l'adresse du serveur Domoticz dans la variable "ip"

Code : Tout sélectionner

-- Ce script permet de renvoyer  les commandes à certain périphériques
-- aprés 60s et toutes les 30mn
-- de sorte à fiabiliser leur fonctionnement

local ip = '192.168.1.10:8080'   -- user:pass@ip:port de domoticz

local switchs={}

InterrupteursSansEtat=uservariables["InterrupteursSansEtat"]
for DeviceName in string.gmatch(InterrupteursSansEtat, "[^|]+") do
        switchs[#switchs + 1] = DeviceName
end

function timedifference(s)
   year = string.sub(s, 1, 4)
   month = string.sub(s, 6, 7)
   day = string.sub(s, 9, 10)
   hour = string.sub(s, 12, 13)
   minutes = string.sub(s, 15, 16)
   seconds = string.sub(s, 18, 19)
   t1 = os.time()
   t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
   difference = os.difftime (t1, t2)
   return difference
end

function urlencode(str)
   if (str) then
    str = string.gsub (str, "\n", "\r\n")
    str = string.gsub (str, "([^%w ])",
    function (c) return string.format ("%%%02X", string.byte(c)) end)
    str = string.gsub (str, " ", "+")
    end
   return str
end

commandArray = {}

for key, valeur in pairs(switchs) do
    -- Test si l’interrupteur existe
    if ( otherdevices[valeur]=='On' or otherdevices[valeur]=='Off' ) then
        
        -- Création de la variable si elle n'existe pas
        if(uservariables['R_'..valeur] == nil) then
            print('Renforcement : création variable R_'..valeur)
            commandArray[tonumber(key)]={['OpenURL']=ip..'/json.htm?type=command&param=saveuservariable&vname=R_'..urlencode(valeur)..'&vtype=2&vvalue='..urlencode(otherdevices[valeur])}
        end
 
        if ( otherdevices[valeur] ~= uservariables['R_'..valeur] and timedifference(otherdevices_lastupdate[valeur]) > 60) then             -- Renforcement aprés changement d'état 
            print('Renforcement : '..valeur.. ' -> ' ..otherdevices[valeur])
            commandArray[valeur] = otherdevices[valeur]
            commandArray['Variable:R_'..valeur]=otherdevices[valeur]
        elseif (timedifference(otherdevices_lastupdate[valeur]) > 1800) then        -- Renforcement aprés 30mn
            print('Renforcement 30mn : '..valeur.. ' -> ' ..otherdevices[valeur])
            commandArray[valeur] = otherdevices[valeur]
            commandArray['Variable:R_'..valeur]=otherdevices[valeur]
        end
    
    else 
        print('RENFORCEMENT : L interrupteur '..valeur..' n existe pas !')
    end

end
return commandArray
A noter que vil1driver avait proposé un script similaire mais basé sur le changement d'état ici : Envoyer 2 fois les commandes On/Off (send twice)

Re: Renforcement du signal pour les interrupteurs sans état

Publié : 03 août 2016, 18:32
par vil1driver
Salut,

J'utilise quelque-chose d'assez similaire depuis mes débuts avec domoticz.

Je me suis inspiré de ce blog:

http://domoticz.blogspot.fr/2014/07/un- ... e.html?m=1

Qu'entends tu par 'sans état' ?

Re: Renforcement du signal pour les interrupteurs sans état

Publié : 20 août 2016, 14:02
par balajol
fratton a écrit :Ce script permet de renvoyer les commandes à certain périphériques (par exemple les prises 433Mhz) après 60s et toutes les 30mn de sorte à fiabiliser leur fonctionnement (par exemple être sûr que le chauffage est allumé).

Installation :
1) Créer une variable utilisateur InterrupteursSansEtat et mettre les noms des interrupteurs séparés par un pipe "|".
exemple : Prise1|Prise2|Ma VMC|Prise4
Le script testera si le device existe (On ou Off) et créera la variable correspondante.

2) Créer un Script LUA de type TIME nommé RENFORCEMENT et changer l'adresse du serveur Domoticz dans la variable "ip"

Code : Tout sélectionner

-- Ce script permet de renvoyer  les commandes à certain périphériques
-- aprés 60s et toutes les 30mn
-- de sorte à fiabiliser leur fonctionnement

local ip = '192.168.1.10:8080'   -- user:pass@ip:port de domoticz

local switchs={}

InterrupteursSansEtat=uservariables["InterrupteursSansEtat"]
for DeviceName in string.gmatch(InterrupteursSansEtat, "[^|]+") do
        switchs[#switchs + 1] = DeviceName
end

function timedifference(s)
   year = string.sub(s, 1, 4)
   month = string.sub(s, 6, 7)
   day = string.sub(s, 9, 10)
   hour = string.sub(s, 12, 13)
   minutes = string.sub(s, 15, 16)
   seconds = string.sub(s, 18, 19)
   t1 = os.time()
   t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
   difference = os.difftime (t1, t2)
   return difference
end

function urlencode(str)
   if (str) then
    str = string.gsub (str, "\n", "\r\n")
    str = string.gsub (str, "([^%w ])",
    function (c) return string.format ("%%%02X", string.byte(c)) end)
    str = string.gsub (str, " ", "+")
    end
   return str
end

commandArray = {}

for key, valeur in pairs(switchs) do
    -- Test si l’interrupteur existe
    if ( otherdevices[valeur]=='On' or otherdevices[valeur]=='Off' ) then
        
        -- Création de la variable si elle n'existe pas
        if(uservariables['R_'..valeur] == nil) then
            print('Renforcement : création variable R_'..valeur)
            commandArray[tonumber(key)]={['OpenURL']=ip..'/json.htm?type=command&param=saveuservariable&vname=R_'..urlencode(valeur)..'&vtype=2&vvalue='..urlencode(otherdevices[valeur])}
        end
 
        if ( otherdevices[valeur] ~= uservariables['R_'..valeur] and timedifference(otherdevices_lastupdate[valeur]) > 60) then             -- Renforcement aprés changement d'état 
            print('Renforcement : '..valeur.. ' -> ' ..otherdevices[valeur])
            commandArray[valeur] = otherdevices[valeur]
            commandArray['Variable:R_'..valeur]=otherdevices[valeur]
        elseif (timedifference(otherdevices_lastupdate[valeur]) > 1800) then        -- Renforcement aprés 30mn
            print('Renforcement 30mn : '..valeur.. ' -> ' ..otherdevices[valeur])
            commandArray[valeur] = otherdevices[valeur]
            commandArray['Variable:R_'..valeur]=otherdevices[valeur]
        end
    
    else 
        print('RENFORCEMENT : L interrupteur '..valeur..' n existe pas !')
    end

end
return commandArray
A noter que vil1driver avait proposé un script similaire mais basé sur le changement d'état ici : Envoyer 2 fois les commandes On/Off (send twice)
Bonjour,
J'ai essayé ce sript pour verifier l'état d'un prise PHENIX,
A priori cela ne fonctionne pas, voilà ce que donne le LOG

2016-08-20 13:32:03.557 Error: EventSystem: in C:\Program Files (x86)\Domoticz\scripts\lua\script_time_renforcement.lua: ... (x86)\Domoticz\scripts\lua\script_time_renforcement.lua:10: bad argument #1 to 'gmatch' (string expected, got nil)

J' ai bien declaré la variable utilisateur:

Nom de la variable: InterrupteursSansEtat
Type: chaîne
Valeur de la variable: VoyantP.Garage-OUV-Pri-Phenix-8

Modifié également l'adresse de Domoticz dans le script:

local ip = '192.168.0.17:8090' -- XXXXXXXX:XXXXXXXX@192.168.0.17:8090 (X remplace les identifiants réels)

Redémarrage de DOMOTICZ également..

J'ai surement oublié quelque-chose, merci de votre aide éventuelle.
Cordialement
Bertrand

Re: Renforcement du signal pour les interrupteurs sans état

Publié : 20 août 2016, 15:59
par vil1driver
Salut,

à titre de test, essai de remplacer la ligne

Code : Tout sélectionner

InterrupteursSansEtat=uservariables["InterrupteursSansEtat"]
par celle ci

Code : Tout sélectionner

InterrupteursSansEtat="VoyantP.Garage-OUV-Pri-Phenix-8"
qui pourrait être

Code : Tout sélectionner

InterrupteursSansEtat="Prise1|Prise2|Ma VMC|Prise4"
pour que l'usage du couple login/password puisse fonctionner dans l'url, il te faut impérativement choisir le mode d'authentification Basic-Auth dans les préférences de domoticz

Re: Renforcement du signal pour les interrupteurs sans état

Publié : 20 août 2016, 16:43
par balajol
Merci vil1driver pour ta réponse,
A priori je n'ai plus les erreurs dans le LOG
Une variable utilisateur s'est créée automatiquement (La deuxième ci dessous):

1 InterrupteursSansEtat Chaîne VoyantP.Garage-OUV-Pri-Phenix-8| 2016-08-20 15:55:09

2 R_VoyantP.Garage-OUV-Pri-Phenix-8 Chaîne Off 2016-08-20 16:13:04



De ce fait la variable utilisateur que j'ai créé Manuellement peut être supprimée ? (LA N°1 dans la liste ci dessus)

Si ce n'est abuser de ton temps :oops:
Quelle est la différence, incidence, entre connexion et Basic-Auth ?

Merci
B.

Re: Renforcement du signal pour les interrupteurs sans état

Publié : 20 août 2016, 17:15
par vil1driver
balajol a écrit : De ce fait la variable utilisateur que j'ai créé Manuellement peut être supprimée ? (LA N°1 dans la liste ci dessus)
oui
balajol a écrit : Quelle est la différence, incidence, entre connexion et Basic-Auth ?
je ne suis pas expert..
la 2ème méthode est moins sécurisée à priori, à réserver pour un usage local (pas depuis internet) ou du moins en HTTPS
Source a écrit : There are a few issues with HTTP Basic Auth:

The password is sent over the wire in base64 encoding (which can be easily converted to plaintext).
The password is sent repeatedly, for each request. (Larger attack window)
The password is cached by the webbrowser, at a minimum for the length of the window / process. (Can be silently reused by any other request to the server, e.g. CSRF).
The password may be stored permanently in the browser, if the user requests. (Same as previous point, in addition might be stolen by another user on a shared machine).
Of those, using SSL only solves the first. And even with that, SSL only protects until the webserver - any internal routing, server logging, etc, will see the plaintext password.

So, as with anything it's important to look at the whole picture.

Does HTTPS protect the password in transit? Yes.

Is that enough? Usually, no. (I want to say, always no - but it really depends on what your site is and how secure it needs to be.)
l'autre (sans l'avoir vérifié) doit utiliser une fonction qui va chiffrer (crypter) avant transmission.

Re: Renforcement du signal pour les interrupteurs sans état

Publié : 20 août 2016, 17:58
par fratton
balajol a écrit :A priori cela ne fonctionne pas, voilà ce que donne le LOG

2016-08-20 13:32:03.557 Error: EventSystem: in C:\Program Files (x86)\Domoticz\scripts\lua\script_time_renforcement.lua: ... (x86)\Domoticz\scripts\lua\script_time_renforcement.lua:10: bad argument #1 to 'gmatch' (string expected, got nil)
Salut en passant, on a souvent cette erreur en LUA, dans 99% des cas pour moi, c'est simplement parce que j'ai mal écrit le nom de la variable InterrupteursSansEtat qui devient InterrupteurSansEtat (sans le s a interrupteur). Autre possibilité, la fonction LUA gmatch cherche un pipe "|", vu qu'il n'y a qu'un seul interrupteur, il faut finir par un "|". Ce qui donne :

Valeur de la variable: VoyantP.Garage-OUV-Pri-Phenix-8|
vil1driver a écrit :Qu'entends tu par 'sans état' ?
Interrupteur dont on ne peut pas lire l'état (cas des prises 433MHz) contrairement aux véritable actionneur respectant un protocole domotique...

Re: Renforcement du signal pour les interrupteurs sans état

Publié : 20 août 2016, 18:09
par vil1driver
fratton a écrit : Interrupteur dont on ne peut pas lire l'état (cas des prises 433MHz) contrairement aux véritable actionneur krespectant un protocole domotique...
Désolé, je ne comprends pas..
Ici tout ou presque est en 433 et dans domoticz toutes mes prises/actionneurs ont un état (On ou Off)
D'ailleurs ton script renvoie l'état supposé donc c'est forcément qu'un état est détecté non ?

Re: Renforcement du signal pour les interrupteurs sans état

Publié : 20 août 2016, 18:18
par fratton
Je ne parle pas d'état dans domoticz, mais de l'état du périphérique lui même.
Certain protocole domotique permettent de lire l'état d'un périphérique, ou d’acquitté le changement d'état.

Re: Renforcement du signal pour les interrupteurs sans état

Publié : 20 août 2016, 20:14
par vil1driver
Donc il faut comprendre les inters sans retour d'état ;)