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

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
fratton
Messages : 150
Inscription : 19 août 2015, 16:38

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

Message 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)
Raspberry Pi B+ / RF-Link 433MHz / divers device maison 433MHz et Wifi
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Renforcement du signal pour les interrupteurs sans état

Message 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' ?
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
balajol
Messages : 864
Inscription : 13 nov. 2015, 18:54
Localisation : 62

Re: Renforcement du signal pour les interrupteurs sans état

Message 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
2024.6 PC Windows10 ; 2ème DEBIAN 10;DANFOSS LC13, Topp; Senseurs univ FIBARO FGBS001, Flood Sensor, ZMNHBD1 Flush 2 Relays ; FIBARO FGS222-FGS212;RFXCOM-RFXtrx433 USB 433.92MHz , Prises Phénix, Prises et Eclairage DI-O, SOMFY RTS,Sonoff ..
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Renforcement du signal pour les interrupteurs sans état

Message 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
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
balajol
Messages : 864
Inscription : 13 nov. 2015, 18:54
Localisation : 62

Re: Renforcement du signal pour les interrupteurs sans état

Message 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.
2024.6 PC Windows10 ; 2ème DEBIAN 10;DANFOSS LC13, Topp; Senseurs univ FIBARO FGBS001, Flood Sensor, ZMNHBD1 Flush 2 Relays ; FIBARO FGS222-FGS212;RFXCOM-RFXtrx433 USB 433.92MHz , Prises Phénix, Prises et Eclairage DI-O, SOMFY RTS,Sonoff ..
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Renforcement du signal pour les interrupteurs sans état

Message 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.
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
fratton
Messages : 150
Inscription : 19 août 2015, 16:38

Re: Renforcement du signal pour les interrupteurs sans état

Message 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...
Raspberry Pi B+ / RF-Link 433MHz / divers device maison 433MHz et Wifi
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Renforcement du signal pour les interrupteurs sans état

Message 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 ?
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
fratton
Messages : 150
Inscription : 19 août 2015, 16:38

Re: Renforcement du signal pour les interrupteurs sans état

Message 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.
Raspberry Pi B+ / RF-Link 433MHz / divers device maison 433MHz et Wifi
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Renforcement du signal pour les interrupteurs sans état

Message par vil1driver »

Donc il faut comprendre les inters sans retour d'état ;)
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Répondre