Page 4 sur 5

Re: Correction de script LUA

Publié : 08 févr. 2019, 13:24
par f0emm
Salut
Merci pour ta réponse, ça valide ce que je pensais faire.
Bonne journée.
A+
Fab

Re: Correction de script LUA

Publié : 10 févr. 2019, 10:08
par f0emm
Bonjour,
C'est dimanche, le temps est minable sur la Bretagne, je remets le nez dedans.

Et un script pour la piscine:

Code : Tout sélectionner

commandArray={}

local heure = os.date("%H:%M")
now=os.date("*t")

local Var = uservariables['Filtration']
---------------------------------------------------------------------------------------
if now.min % 1 == 0 then  -- exécution toutes les minutes
	local t = tonumber(string.format("%.1f", otherdevices_temperature['Temp. piscine']))
	print("Temp.piscine " ..  t..' °C')
	print("Heure " ..  heure)
	print("Durée filtration " ..  Var..' min.')
        
    if (t <= 12 and (heure == "09:00" or heure == "17:00")) and otherdevices['D1-Filtration']=='Off' then
    commandArray['D1-Filtration']='On FOR 30'
    commandArray['SendNotification']='Filtration piscine#En marche pour 30 minutes.##0###GCM'
        
    elseif  t > 12 and (heure == "07:00" or heure == "09:00" or heure == "11:00" or heure == "13:00" or heure == "15:00" or heure == "17:00" or heure == "19:00" or heure == "21:00") and otherdevices['D1-Filtration']=='Off' then
    commandArray['D1-Filtration']='On FOR 'Var''
    commandArray['SendNotification']='Filtration piscine#En marche pour .. 'Var' .. minutes.##0###GCM'
    end
end
return commandArray
Le script le plus important de mon système domotique qui doit être d'une fiabilité à toute épreuve.
Si quelqu'un peut me le confirmer sachant qu'il y a une erreur ici je pense

Code : Tout sélectionner

(t <= 12 and (heure == "10:06" or heure == "17:00"))
Bon dimanche à tous.
A+
Fab

Re: Correction de script LUA

Publié : 10 févr. 2019, 11:39
par denis_brasseur
f0emm a écrit : 10 févr. 2019, 10:08 Le script le plus important de mon système domotique qui doit être d'une fiabilité à toute épreuve.
Si quelqu'un peut me le confirmer sachant qu'il y a une erreur ici je pense

Code : Tout sélectionner

(t <= 12 and (heure == "10:06" or heure == "17:00"))
Bon dimanche à tous.
A+
Fab
Je ne vois rien d'anormal, pour moi cela signifie que la condition sera respecté si la température de la piscine est <= à 12 °, et qu'il est (10:06 ou 17:00). Cela est cohérent avec une exécution toute les minutes.
Je ne connait pas la logique que tu veux appliquer, mais je ne vois pas d'erreur dans cette ligne.

Cette ligne :

Code : Tout sélectionner

commandArray['SendNotification']='Filtration piscine#En marche pour .. 'Var' .. minutes.##0###GCM'
devrait etre comme ceci :

Code : Tout sélectionner

commandArray['SendNotification']='Filtration piscine#En marche pour '..Var..' minutes.##0###GCM'
'Texte a afficher ' .. variable .. ' suite du texte à afficher'

La commande

Code : Tout sélectionner

commandArray['D1-Filtration']='On FOR 30'
me parait plutot hasardeuse, j'utiliserais plutôt

Code : Tout sélectionner

commandArray['D1-Filtration']='On' -- mise en route de la pompe
commandArray['D1-Filtration']='Off AFTER 1800' -- arrêt au bout de 1800 s (30 mn)
Bon dimanche
denis

Re: Correction de script LUA

Publié : 10 févr. 2019, 15:06
par f0emm
Bonjour Denis,
Encore merci pour ton aide.
Plusieurs soucis :

Code : Tout sélectionner

commandArray['D1-Filtration']='On' -- mise en route de la pompe
commandArray['D1-Filtration']='Off AFTER 1800' -- arrêt au bout de 1800 s (30 mn)
Ne fonctionne pas, je l'avais déjà constaté avec Blockly, ça me fait un ON/OFF direct.
Peut être ma configuration qui veut ça étant donné que le ON/OFF de cet inter actionne par json un ON Push donc ON/OFF inter = ON/ON.
-> Réglé par un 'On FOR 30'

Mon nouveau script :

Code : Tout sélectionner

commandArray={}

local heure = os.date("%H:%M")
now=os.date("*t")

---------------------------------------------------------------------------------------
if now.min % 1 == 0 then  -- exécution toutes les minutes
	local t = tonumber(string.format("%.1f", otherdevices_temperature['Temp. piscine']))
	local matemperature = tonumber(string.format("%.1f", otherdevices_temperature['Temp. piscine']))
	local Duree = matemperature /16*60
	
	print("Temp.piscine " ..  t..' °C')
	print("Heure " ..  heure)
	print("Durée filtration " ..  Duree..' min.')
	
	-- Si température piscine est inf. ou égale à 12 and heure égal 09:00 ou 17:00 and D1 Filtration=Off
        
    if t <= 12 and (heure == "14:56" or heure == "17:00") and otherdevices['D1-Filtration']=='Off' then
    commandArray['D1-Filtration']='On FOR 'Duree'' -- arrêt au bout de variable
    commandArray['SendNotification']='Filtration piscine#En marche pour '.. Duree ..' minutes.##0###GCM'
    
    -- Si température piscine est supérieure à 12 and heure égal 07:00 ..... 21:00 and D1 Filtration=Off
        
    elseif t > 12 and (heure == "07:00" or heure == "09:00" or heure == "11:00" or heure == "13:00" or heure == "15:00" or heure == "17:00" or heure == "19:00" or heure == "21:00") and otherdevices['D1-Filtration']=='Off' then
    commandArray['D1-Filtration']='On FOR 'Duree'' -- arrêt au bout de variable
    commandArray['SendNotification']='Filtration piscine#En marche pour '.. Duree ..' minutes.##0###GCM'
    end
end
return commandArray
Je me retrouve avec cette erreur :

Code : Tout sélectionner

Filtration auto: [string "commandArray={}..."]:19: attempt to call local 'Duree' (a number value)
2019-02-10 15:12:28.735 Status: LUA: Durée filtration 41.25 min.
Le print Duree envoyé dans le LOG est bon.
Après ça ce script sera au top !
Merci.
Bon dimanche.
A+
Fab

Re: Correction de script LUA

Publié : 10 févr. 2019, 15:35
par f0emm
J'ai compris !
il était temps depuis 8h ce matin.

Pour le ON for:

Code : Tout sélectionner

'On FOR '..Duree..''
Et ça fonctionne.

Le script au complet :

Code : Tout sélectionner

commandArray={}

local heure = os.date("%H:%M")
now=os.date("*t")

---------------------------------------------------------------------------------------
if now.min % 1 == 0 then  -- exécution toutes les minutes
	local t = tonumber(string.format("%.1f", otherdevices_temperature['Temp. piscine']))
	local matemperature = tonumber(string.format("%.1f", otherdevices_temperature['Temp. piscine']))
	local Duree = matemperature /16*60
	
	print("Temp.piscine " ..  t..' °C')
	print("Heure " ..  heure)
	print("Durée filtration " ..  Duree..' min.')
	
	-- Si température piscine est inf. ou égale à 12 and heure égal 09:00 ou 17:00 and D1 Filtration=Off
        
    if t <= 12 and (heure == "09:00" or heure == "17:00") and otherdevices['D1-Filtration']=='Off' then
    commandArray['D1-Filtration']='On FOR 30' -- arrêt au bout de 30 minutes
    commandArray['SendNotification']='Filtration piscine#En marche pour 30 minutes.##0###GCM'
    
    -- Si température piscine est supérieure à 12 and heure égal 07:00 ..... 21:00 and D1 Filtration=Off
        
    elseif t > 12 and (heure == "07:00" or heure == "09:00" or heure == "11:00" or heure == "13:00" or heure == "15:00" or heure == "17:00" or heure == "19:00" or heure == "21:00") and otherdevices['D1-Filtration']=='Off' then
    commandArray['D1-Filtration']='On FOR '..Duree..'' -- arrêt au bout du temps calculé 'Duree'
    commandArray['SendNotification']='Filtration piscine#En marche pour '.. Duree ..' minutes.##0###GCM'
    end
end
return commandArray
Quand tout sera terminé et fonctionnel je ferais un tuto sur comment domotiser une piscine et son environnement avec un Sonoff 4CH PRO à 17 euros.

Il me reste le hors gel qui je pense est bon :

Code : Tout sélectionner

commandArray={}

local heure = os.date("%H:%M")
now=os.date("*t")

-----------------------------------------------

if now.min % 1 == 0 then  -- exécution toutes les minutes
	local t1 = tonumber(string.format("%.1f", otherdevices_temperature['Temp. piscine']))
	local t2 = tonumber(string.format("%.1f", otherdevices_temperature['Temp. exterieur']))
	
    if otherdevices['D1-Filtration']=='Off' and (t1 <= 5 and t2 <= -3) then
        commandArray['D1-Filtration']='On FOR 30' -- mise en route de la pompe
        commandArray['SendNotification']='Filtration piscine#Hors gel : mise en marche pour 30 minutes.##0###GCM'
    end
end

return commandArray
D'ailleurs je dois pouvoir l'incorporer au premier script avec un deuxième 'elseif' ?

Code : Tout sélectionner

commandArray={}

local heure = os.date("%H:%M")
now=os.date("*t")

---------------------------------------------------------------------------------------
if now.min % 1 == 0 then  -- exécution toutes les minutes
	local t = tonumber(string.format("%.1f", otherdevices_temperature['Temp. piscine']))
    local t2 = tonumber(string.format("%.1f", otherdevices_temperature['Temp. exterieur']))
	local matemperature = tonumber(string.format("%.1f", otherdevices_temperature['Temp. piscine']))
	local Duree = matemperature /16*60

	print("Temp.piscine " ..  t..' °C')
	print("Heure " ..  heure)
	print("Durée filtration " ..  Duree..' min.')
	
	-- Si température piscine est inf. ou égale à 12 and heure égal 09:00 ou 17:00 and D1 Filtration=Off
        
    if t <= 10 and (heure == "09:00" or heure == "17:00") and otherdevices['D1-Filtration']=='Off' then
    commandArray['D1-Filtration']='On FOR 30' -- arrêt au bout de variable
    commandArray['SendNotification']='Filtration piscine#En marche pour 30 minutes.##0###GCM'
    
    -- Si température piscine est supérieure à 12 and heure égal 07:00 ..... 21:00 and D1 Filtration=Off
        
    elseif t > 10 and (heure == "07:00" or heure == "09:00" or heure == "11:00" or heure == "13:00" or heure == "15:00" or heure == "17:00" or heure == "19:00" or heure == "21:00") and otherdevices['D1-Filtration']=='Off' then
    commandArray['D1-Filtration']='On FOR '..Duree..'' -- arrêt au bout de variable
    commandArray['SendNotification']='Filtration piscine#En marche pour '.. Duree ..' minutes.##0###GCM'
    
    -- Hors gel
     
    elseif (t <= 5 and t2 <= -3) and otherdevices['D1-Filtration']=='Off' then
    commandArray['D1-Filtration']='On FOR 30' -- mise en route de la pompe
    commandArray['SendNotification']='Filtration piscine#Hors gel : mise en marche pour 30 minutes.##0###GCM'
    end
end
return commandArray
Merci à tous.
A+
Fab

Re: Correction de script LUA

Publié : 10 févr. 2019, 18:23
par denis_brasseur
f0emm a écrit : 10 févr. 2019, 15:35 D'ailleurs je dois pouvoir l'incorporer au premier script avec un deuxième 'elseif' ?
Oui, c'est cohérent, même l’ordre n'est pas important, puisque pour les 3 conditions, les 3 actions sont identiques.

Tu peux simplifier (mais çà ne change absolument rien au fonctionnement) en sortant le test if otherdevices['D1-Filtration']=='Off' des 3 boucles, puisque tu fais 3 fois ce test.

Code : Tout sélectionner

	--si D1 Filtration=Off
    if otherdevices['D1-Filtration']=='Off' then    
			-- Hors gel
		if (t <= 5 and t2 <= -3) then
			
			-- Si température piscine est inf. ou égale à 12 and heure égal 09:00 ou 17:00 
		else if (t <= 10 and (heure == "09:00" or heure == "17:00")) then
		
			-- Si température piscine est supérieure à 12 and heure égal 07:00 ..... 21:00 and D1 Filtration=Off	
		elseif (t > 10 and (heure == "07:00" or heure == "09:00" or heure == "11:00" or heure == "13:00" or heure == "15:00" or heure == "17:00" or heure == "19:00" or heure == "21:00")) then
		
		end
	end

Code : Tout sélectionner

local heure = os.date("%H:%M")
now=os.date("*t")

commandArray={}
---------------------------------------------------------------------------------------
if now.min % 1 == 0 then  -- exécution toutes les minutes
	local t = tonumber(string.format("%.1f", otherdevices_temperature['Temp. piscine']))
    local t2 = tonumber(string.format("%.1f", otherdevices_temperature['Temp. exterieur']))
	local matemperature = tonumber(string.format("%.1f", otherdevices_temperature['Temp. piscine']))
	local Duree = matemperature /16*60

	print("Temp.piscine " ..  t..' °C')
	print("Heure " ..  heure)
	print("Durée filtration " ..  Duree..' min.')
	
	--si D1 Filtration=Off
	
    if otherdevices['D1-Filtration']=='Off' then    
		-- Hors gel
		 
		if (t <= 5 and t2 <= -3) then
			commandArray['D1-Filtration']='On FOR 30' -- mise en route de la pompe
			commandArray['SendNotification']='Filtration piscine#Hors gel : mise en marche pour 30 minutes.##0###GCM'
			
		-- Si température piscine est inf. ou égale à 10 and heure égal 09:00 ou 17:00 
		
		else if (t <= 10 and (heure == "09:00" or heure == "17:00")) then
			commandArray['D1-Filtration']='On FOR 30' -- arrêt au bout de variable
			commandArray['SendNotification']='Filtration piscine#En marche pour 30 minutes.##0###GCM'
		
		-- Si température piscine est supérieure à 10 and heure égal 07:00 ..... 21:00 and D1 Filtration=Off
			
		elseif (t > 10 and (heure == "07:00" or heure == "09:00" or heure == "11:00" or heure == "13:00" or heure == "15:00" or heure == "17:00" or heure == "19:00" or heure == "21:00")) then
			commandArray['D1-Filtration']='On FOR '..Duree -- arrêt au bout de variable
			commandArray['SendNotification']='Filtration piscine#En marche pour '.. Duree ..' minutes.##0###GCM'
		
		
		end
	end
end
return commandArray
SI par contre tu met une durée de filtration différente pour le hors gel, je te conseille de mettre cette condition en premier (et non pas en 3eme) afin que cette condition hors gel soit exécuté même si t <= 10 and (heure == "09:00" or heure == "17:00"), puisque la condition t <= 10 sera respecté même en hors gel.

Un simple détail, ça ne change rien a ce que tu a fait.

Re: Correction de script LUA

Publié : 10 févr. 2019, 20:52
par f0emm
Salut,
Bon, et bien après pas moins de 12h de taf ce script est abouti.
Encore merci Denis de me donner de ton temps.
Quel sera le prochain script ?
Je m'en ferais bien un qui active mon éclairage quand je rentre de nuit à la maison mais pour l'instant je ne trouve pas le géorepérage de l'appli Domoticz sur smartphone très précis.
Entrée/sortie du périmètre aléatoire.
Je vais essayer de trouver autre chose.
Bonne soirée
A+
Fab

Re: Correction de script LUA

Publié : 11 févr. 2019, 19:06
par f0emm
Salut,
J'ai essayé pas mal de chose mais rien ne veut fonctionner.
Je souhaiterais rajouter 20 minutes à l'heure du coucher du soleil.

Code : Tout sélectionner

local heure = os.date("%H:%M")
-- retourne l'heure du coucher de soleil ex: "22:15"
coucherSoleil = string.sub(os.date("!%X",60*timeofday['SunsetInMinutes']), 1, 5)
local coucherSoleil2 = (coucherSoleil + 00:20)
+20, +'00:20', +00:20, y'a rien qui fonctionne :lol:

Encore une subtilité !
Merci.
Bonne soirée.
A+
Fab

Re: Correction de script LUA

Publié : 11 févr. 2019, 20:19
par vil1driver
Salut,

L'heure du coucher en minute t'es donné par

Code : Tout sélectionner

timeofday['SunsetInMinutes']
C'est à cela que tu dois ajouter tes 20 minutes

Code : Tout sélectionner

timeofday['SunsetInMinutes'] + 20
En suite on passe le tout en seconde

Code : Tout sélectionner

60 * (timeofday['SunsetInMinutes'] + 20)
Puis on mets en forme

Code : Tout sélectionner

coucherSoleil2 = string.sub(os.date("!%X",60*(timeofday['SunsetInMinutes']+20)), 1, 5)

Re: Correction de script LUA

Publié : 11 févr. 2019, 21:02
par f0emm
Salut
Je vais réessayer, j'ai trouvé cette méthode tout à l'heure sur la toile mais elle ne fonctionnait pas.
J'ai peut être zapé quelque chose.
Merci.
Bonne soirée.
A+
Fab