Script lumière

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 <\>.
vwolive
Messages : 27
Inscription : 07 janv. 2018, 12:17

Script lumière

Message par vwolive »

Bonjour à tous,

Je fais appel à vous pour écrire un script que j'arrive pas à faire marcher.
C'est pour gérer la lumière de mon garage. Aujourd'hui j'ai un capteur d'ouverture de la porte, un capteur d'ouverture du garage, un détecteur de mouvement, et bientôt un deuxième (mon garage est grand et un ne suffit pas).
Je souhaite que lorsque j'ouvre la porte ou le garage la lumière s'allume pour une minute. Si en plus il détecte la présence sur un ou l'autre des capteurs de mouvement, il relance pour 10 minutes à chaque fois.
Si il y a des bonnes âmes pour m'aider, c'est volontiers.
Merci à tous
thier
Messages : 807
Inscription : 26 sept. 2015, 10:32
Localisation : charente

Re: Script lumière

Message par thier »

Aucun intérêt à écrire ton script. Le mieux c'est d'apprendre. Post ton script qui ne fonctionne pas et on t'aidera. Inspire toi des exemples qui sont dans le dossier /scripts/lua. Commence simple, si détecteur détecte , j'allume la lumière. Puis tu compliques au fur et à mesure.
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.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Script lumière

Message par vil1driver »

Salut,

+1
Dernière modification par vil1driver le 05 avr. 2018, 03:42, modifié 1 fois.
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
vwolive
Messages : 27
Inscription : 07 janv. 2018, 12:17

Re: Script lumière

Message par vwolive »

Pas de soucis, je vous le met demain. La partie avec un détecteur de mouvement marche, j'ai adapté un script que j'ai trouvé, mais je ne sais pas comment intégrer l'allumage d'une minute lorsque j'ouvre la porte.
vwolive
Messages : 27
Inscription : 07 janv. 2018, 12:17

Re: Script lumière

Message par vwolive »

Alors voici mon script qui ne gère qu'un seul capteur de mouvement.

Code : Tout sélectionner

--
-- Obtenir l'heure actuelle
t1 = os.time()
-- Obtenir l'heure / la date de la dernière mise à jour sur le capteur de mouvement
s = otherdevices_lastupdate['Détecteur de mouvement Garage']

-- Couper les données retournées avec la dernière mise à jour sur le détecteur de mouvement pour obtenir des valeurs individuelles
-- Source: https://www.domoticz.com/wiki/Event_script_examples#Send_a_warning_when_the_garage_door_has_been_open_for_more_than_10_minutes
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)

-- Set to false to disable print
debug=true

commandArray = {}
    -- Convertir les données coupées en format d'heure
    t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
    -- Différence entre l'heure actuelle et la dernière mise à jour du détecteur de mouvement
    difference = (os.difftime (t1, t2))
    -- Si le détecteur de mouvement change 'On'
    if (devicechanged['Détecteur de mouvement Garage'] == 'On') then
        if (debug) then
            print("Motion on")
        end
        -- si la prise de la lumière est arrêtée 'Off'
        if (otherdevices['Lumière Garage'] == 'Off') then
            -- Allumer la Lumière
            commandArray[1]={['Lumière Garage']='On'}
           
        end
    end
    -- Si la lumière est 'On' et le détecteir de mouvement est 'Off' et la difference entre l'heure actuelle et le dernier mouvement détecté alors on arrète la lumière
    -- Gardez en tête que l'ampoule s'éteindra après que le détecteur de mouvement s'éteindra + le temps que vous définissez avec la différence> 60
    -- Par exemple, mon détecteur de mouvement s'éteint après 120 secondes, alors ajoutez le 60 et l'ampoule s'éteint après 120 + 60 = 180 secondes
    if ((otherdevices['Lumière Garage'] == 'On') and otherdevices['Détecteur de mouvement Garage'] == 'Off' and difference > 600) then
        if (debug) then
            print('Arrêter Lumière Garage après '..difference..'.')
        end
        -- Arrêter la Lumière
        commandArray['Lumière Garage']='Off'
    end
return commandArray
et voici le Blocky que je voudrais ajouter dans mon code. Seulement je ne sais pas par quel bout le prendre.
blocky.PNG
blocky.PNG (26.46 Kio) Consulté 6602 fois
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Re: Script lumière

Message par landaisbenj »

Comme je le dis a chaque fois il faut poser le cheminement de ce que tu veux à l’écrit. Une fois synthaxé c'est déjà beaucoup plus facile de le scripter.

Dans ton cas on voit bien qu'il y a beaucoup de commentaire donc ca à l'air d’être bon pour le lua. Pour le blockly écris le en vocabulaire. Apres tu traduit ça en LUA et après tu verra que c'est plus simple a intégrer dans un script.

En gros si on commence par le debut, ton blockly indique cela:
SI (la porte du garage est a ON ou la porte du garage est a ON) ET (le mode absence est a OFF ET la lumiere est a OFF)
Il y a deja un probleme dans les deux premiers arguments de la condition.

Pour ton premier script je te suggère aussi de le simplifier et de l'organiser. Quand il sera plus clair, tu repéreras peut être plus facilement où intégrer ton deuxième script.

[EDIT] En relisant un peu le premier script en LUA je le trouve etonnant. S'agit-il d'un script time ?
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
vwolive
Messages : 27
Inscription : 07 janv. 2018, 12:17

Re: Script lumière

Message par vwolive »

Donc bonjour à tous,

je tiens à préciser que je n'ai jamais écris de script. je connais la logique, je connais le grafcet et la logique de par ma formation, mais j'ai jamais écrit en lua.
ce que je veux faire (et pour lequel j'ai besoin d'aide) est le code suivant:

Code : Tout sélectionner

-- Gestion de la lumière du GARAGE
--
-- otherdevices, otherdevices_lastupdate and otherdevices_svalues are arrays for all devices: 
   otherdevices['Porte Garage'] = "On"
   otherdevices['Portail Garage'] = "On"
   otherdevices['Detecteur de mouvement Garage 1'] = "On"
   otherdevices['Detecteur de mouvement Garage 2'] = "On"
   otherdevices['Lumière Garage'] = "On"
   otherdevices['Mode Absence'] = "On"
  
  
commandArray = {}

-- Ecrire false pour désactiver le débug
debug=true

--Si je ne suis pas absent de la maison alors je déroule le script
if (otherdevices['Mode Absence'] == 'Off') then
    
    -- Si la porte de garage OU le portail du garage s'ouvre ET que la lumière du garage est étteinte (le but est de ne pas relancer le compte à rebour en sortant du garage)
    if ((deviceschanged['Porte Garage'] == 'On') or (otherdevices['Portail Garage'] == 'On') and otherdevices['Lumière Garage'] == 'Off') then
        
        --Allumer la lumière du garage pour une minute
        if (debug) then
            print("Ouverture de porte et allumage de la lumière du garage")
        end
        if (otherdevices['Lumière Garage'] == 'Off') then
            -- Allumer la Lumière
            commandArray[1]={['Lumière Garage']='On'}
        end    
    end        
            
            
            
    --si le détecteur de mouvement 1 OU le détecteur de mouvement 2 =ON alors
                --Allumer la lumière du garage pour 10 minutes
    
end

return commandArray
Evidemment le code n'est pas abouti car je ne connais pas le langage ni comment m'y prendre. s'il y a une âme charitable pour m'aider, c'est volontiers.

Merci
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Re: Script lumière

Message par landaisbenj »

Bah si tu a la logique, rien qu'avec la base du script que tu as tu peux y arriver...

Pour pas s’éterniser sur ça, ça doit être un truc comme ça:

Le changement d’état sur un device est declaré par la table: devicechanged
L’état à l'instant T d'un device est déclaré par la table: otherdevices
L'action sur un device est demandé par la table commandArray
Insérer un ordre dans la table commandArray peut se faire comme ça: commandArray[#commandArray+1]={'device'='ordre'}
Domoticz sachant lire certains ordre tordu, demander une temporisation se fait comme ca: commandArray[#commandArray+1]={'device'='On FOR 600'}

Code : Tout sélectionner

--SI la LUMIERE est à OFF ALORS
if otherdevices['Lumiere']=='Off' then

  --SI la PORTE change pour OPEN ou le PORTAIL change pour OPEN ALORS
  if devicechanged['Portail Garage']=='On' or devicechanged['Porte Garage']=='On' then
    --ALLUMER LA LUMIERE
    commandArray[#commandArray+1]={['Lumière Garage']='On'}
  end

  --SI le DETECTEUR 1 passe à ON ou le DETECTEUR 2 passe à ON ALORS
  if devicechanged['Detecteur de mouvement Garage 1']=='On' or devicechanged['Detecteur de mouvement Garage 2']=='On' then
    --ALLUMER LA LUMIERE pendant 10minutes
    commandArray[#commandArray+1]={['Lumière Garage']='On FOR 600'}
  end
end
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
vwolive
Messages : 27
Inscription : 07 janv. 2018, 12:17

Re: Script lumière

Message par vwolive »

super, avec ça je devrais m'en sortir....
question bête, a quoi correspond le [#commandArray+1] ?
vwolive
Messages : 27
Inscription : 07 janv. 2018, 12:17

Re: Script lumière

Message par vwolive »

Bonjour à tous,

je me suis servi de tous vos conseils, et j'ai réalisé mon code. Il est en "device".
il m'allume bien la lumière, MAIS, il ne l'arrête pas.
qu'il soit allumé par la porte (lumière = OFF ==> Ouverture de la porte ==> allumage pour 60 secondes) la lumière ne s'arrete pas.
par le détecteur de mouvement non plus (Lumière = ON ==> Détection de mouvement ==> allumage pour 600s)
cependant, le "ON FOR 600" remet l'état du switch initial après 600s soit "ON" donc ce serait normal que ça ne marche pas.

Ce que je veux mettre en place est vraiment une notion arret après 10 minutes si pas de détection de mouvement.
Si je passe 2 heures dans mon garage, je ne veux pas que la lumière s’éteigne pour se rallumer...
Or j'ai également l'impression que la commande "OFF AFTER 600" n'est pas annulée si elle est relancée quelques secondes après... il enverra 2 "OFF"

Voici mon code,

Code : Tout sélectionner

-- Gestion de la lumière du GARAGE

commandArray = {}

-- Ecrire false pour désactiver le débug
debug=true

--(Si je ne suis pas absent de la maison alors je déroule le script pour que la lumière s'allume)
--SI Le MODE ABSENCE est à OFF ALORS
if (otherdevices['Mode Absence'] == 'Off') then
    
    --Si la lumière du garage est étteinte (le but est de ne pas relancer le compte à rebour en sortant du garage)
    --SI la LUMIERE GARAGE est à OFF ALORS
    if otherdevices['Lumière Garage']=='Off' then
        
        -- Si la porte de garage OU le portail du garage s'ouvre
        --SI la PORTE change pour OPEN ou le PORTAIL change pour OPEN ALORS
        if (devicechanged['Portail Garage']=='On' or devicechanged['Porte Garage']=='On') then
            
            --Allumer la lumière du garage pour 60 secondes
            if (debug) then
                print("Ouverture de porte et allumage de la lumière du garage")
            end
            -- Allumer la Lumière pour 60 secondes
            commandArray[#commandArray+1]={['Lumière Garage']='On FOR 60'}
        end        
    end

    --SI le DETECTEUR passe à ON ALORS
    if devicechanged['Détecteur de mouvement Garage']=='On' then
        if (debug) then
            print("Ouverture de porte et allumage de la lumière du garage")
        end
        --Allumer la lumière du garage pour 10 minutes
        commandArray[#commandArray+1]={['Lumière Garage']='On FOR 600'}
    end        
end

return commandArray
Je vous remercie d'avance pour votre aide. Je met toute la bonne volonté pour avancer tout seul et comprendre tout ça... :D
Répondre