Page 1 sur 1

Switch on off sous condition - LUA

Publié : 13 mai 2022, 07:51
par vb35
Bonjour,

Je rencontre un problème que je n'arrive pas à résoudre étant totalement novice en programmation.

Je cherche à faire un petit script qui allume ou éteint une prise connectée, en fonction d'une température.

Contexte :

Domoticz : 192.168.1.11:8080
SondeTemperatureChauffage : 192.168.1.24
Prise chauffage : 192.168.1.25

Action rechercher :

Si "SondeTemperatureChauffage" >=25
Alors "Prise chauffage" = ON durant 20 secondes puis OFF
Récurrence de la commande : toutes les 15minutes

Je ne sais pas si vous allez pouvoir m'aider à intégrer ça en LUA ( si j'ai bien compris ) pour domoticz mais j'avoue que pour le moment je n'y comprend pas grand chose.. Et le Blockly proposé sur domoticz ne me permets pas de faire tout ça.

Par avance merci !

VB

Re: Switch on off sous condition - LUA

Publié : 13 mai 2022, 12:46
par Keros
Bonjour vb35 et bienvenu sur le forum :)

Je ne comprends pas pourquoi tu nous donnes les différentes IP. Normalement tu dois avoir tes différentes prise et capteur dans DomoticZ? C'est bien le cas ? Tu vois la valeur du capteur de température et tu peux actionner ta prise depuis Domoticz ?

Concernant la programmation, j'ai écrit des petits guides dans ma présentation (voir lien dans ma signature) dont un concernant les début en programmation.

Dans le principe, un script de type Time s’exécute toutes les minutes. Si tu souhaites faire une récurrence toutes les 15 minutes, il va falloir vérifier l'heure et n'exécuter ton script que quand les minutes sont égales à 00, 15, 30 ou 45.
Ou sinon, tu peux regarder le langage DzVents dans lequel on peut utiliser une fonction every 15 minutes.
Mais cela est pour un second temps, essaye déjà de faire des action sur ta prise en fonction de la température. tu pourras complexifier le programme dans un deuxième temps.

Re: Switch on off sous condition - LUA

Publié : 13 mai 2022, 14:26
par Jeff
En récupérant un script avec un relevé de température, je suis tombé la dessus, merci Pipiche :D , il y a plein d'exemple

A adapter mais comme tu as la fonction time, tu peux comme le dis Keros, faire minutesnow = 0 ou min = 15 ...

Code : Tout sélectionner

commandArray = {}

tempChbr = otherdevices_svalues['Temperature Chambre Parents']

-- get current time
        timenow = os.date("*t")
        minutesnow = timenow.min + timenow.hour * 60
        minutes = timenow.min
        hoursnow = timenow.hour

	-- at 21:00 let's switch on Ac if not yet done.
	if ( otherdevices_svalues['Temperature Chambre Parents'] >= 25 ) and (minutesnow == 0 or minutesnow == 15 ) then 
		
                commandArray[#commandArray +1]={['Clim Chambre Power']='On'}
	 end
	 
return commandArray
	

Re: Switch on off sous condition - LUA

Publié : 14 mai 2022, 21:28
par vb35
Bonjour tous les deux :)

Merci pour vos réponses !

Pour répondre à Keros, j'avais mis les IP car.. je pensais que dans le code lua il fallait renseigner l'emplacement de chaque périphérique ciblé par le script.

J'ai en effet déjà mes prises et mon capteur. Et j'ai donc bien renseigné une action en fonction de la température et la durée de l'action.
En revanche ce que je n'arrive pas à mettre en place aujourd'hui c'est mêler la récurrence avec la variable température.
J'aimerais que si la température est supérieur à tel degré, la prise se déclenche et qu' elle s'arrête au bout de 20s ( ça c'est ok ) en revanche j'aimerais que la prise ne puisse pas s'allumer de nouveau durant les 15 minutes après que celle ci ce soit arrêtée. Et c'est là que ça coince, je n'arrive pas à mettre ça en place avec le blockly.


Merci pour Jeff je vais étudier tout ça demain :) voir si comprend et si je pourrais adapter à ma situation :)

A bientôt

Re: Switch on off sous condition - LUA

Publié : 15 mai 2022, 10:09
par Keros
Ce n'est pas évident de faire une tempo, surtout en Blocky. Une solution consisterait à déclencher un widget virtuel qui aurait un auto Off à 15 minutes. A la fin de ton script, tu déclenches la tempo. Au début du script, tu vérifies l'état de la tempo : si elle est allumée, c'est que ton script l'a allumée il y a moins de 15 minutes. Si elle est éteinte, tu peux faire tes actions et réactiver la tempo.
Sinon, en code (LUA ou DzVents), il est possible de récupérer le lastupdate d'un widget. En comparant avec l'heure actuelle, tu peux savoir depuis combien de temps le widget n'a pas été mis à jour.

Re: Switch on off sous condition - LUA

Publié : 22 mai 2022, 07:56
par vb35
Hello, bon je n'ai pas réussi à faire ce que je voulais alors je suis passé par ailleurs en mettant simplement un timer sur le déclenchement de la prise. Ce n'est pas optimal pour ce que je voulais faire mais.. ça ira très bien pour le moment :)

Merci à vous pour votre aide

Re: Switch on off sous condition - LUA

Publié : 22 mai 2022, 10:21
par hestia
Hello
une solution avec dzVents, même si je ne suis pas sûr de comprendre exactement les spec 8-)

Code : Tout sélectionner

--[[

Si "SondeTemperatureChauffage" >=25
Alors "Prise chauffage" = ON durant 20 secondes puis OFF
Récurrence de la commande : toutes les 1 5minutes

]]--

SONDE_ID = 2560 -- 'nom' ou idx
TEMP_MAX = 25 -- temp maxi

PRISE_ID = 204 -- 'nom' ou idx
PRISE_SEC = 20 -- durée de la prise On
PRISE_TEMPO = 15 -- 


return {

    logging = 
            { level    =   domoticz.LOG_DEBUG },
            
    on =
        {
            timer =
            {
                'every minute',
            },
        },
	
	execute = function(dz, triggeredItem)
    _G.logMarker =  dz.moduleLabel -- set logmarker to scriptname 

    local devPrise = dz.devices(PRISE_ID)
    local devSonde = dz.devices(SONDE_ID)
    local lastUpdate = devPrise.lastUpdate.minutesAgo
    
    if devPrise.active then
        
        dz.log(devPrise.name .. " déjà allumée")    

    elseif lastUpdate < PRISE_TEMPO then
        
        dz.log(devPrise.name .. " allumée depuis " .. lastUpdate .. " minutes, soit moins de " .. PRISE_TEMPO .. " minutes" )
        
    elseif devSonde.temperature > TEMP_MAX then
        
        dz.log(devSonde.temperature .. ' > ' .. TEMP_MAX)
        devPrise.switchOn().forSec(PRISE_SEC)
        dz.log(devPrise.name .. " s'allume")
        
    else
        
        dz.log(devSonde.temperature .. ' <= ' .. TEMP_MAX)
        
    end


end
}