Page 2 sur 3

Re: Transformer un script LUA en DZVETNS

Publié : 15 juil. 2021, 23:01
par Keros
La fonction CounterToday est utilisée pour les widgets de mesure. C'est par exemple l'information Aujourd'hui que l'on peut lire sur les widgets de consommation électrique. Cela te donne la quantité consommée dans la journée.

Malheureusement pour ton besoin, je ne vois pas de fonction toute faite pour mesurer la durée d'activation d'un interrupteur. C'est pour ça que tu ne trouves pas.

On peut quasiment tout faire en programmation maintenant c'est assez complexe. Je vois plusieurs possibilités :
  • Tu passes par un widget virtuel de type compteur.
    Lorsque ta pompe est en route, tu envois une information de consommation de 1 au compteur. Ainsi, au bout d'une heure de fonctionnement, le CounterToday de ce compteur aura la valeur de 1.
  • Deuxième possibilité : tu fais un script à côté qui tourne toutes les minutes : si la pompe est en route, je rajoute 1 au temps de fonctionnement. A toi de déterminer où tu veux mettre ce temps de fonctionnement : dans un widget, une uservariable, une persistant data. Et tu prévois pour qu'à minuit la durée de fonctionnement repasse à 0.
  • Troisième possibilité : tu calcules à chaque cycle de fonctionnement la durée de mise en route et tu le rajoutes au temps quotidien. Il te faut alors une action au démarrage de la pompe pour enregistrer l'heure de mise en route et à l'arrêt de la pompe, faire le calcul de la durée et la rajouter au temps quotidien.

Re: Transformer un script LUA en DZVETNS

Publié : 16 juil. 2021, 15:18
par boum
kisskool a écrit : Y a t'il un moyen plus efficace et rapide de modifier une variable utilisateur en fonction de la temperature comme en lua ci-dessous? J'ai cru comprendre qu'il etait possible d'utiliser un 'tableau'
Pour compléter ce que t'a répondu Keros, l'utilisation d'un tableau ne simplifiera pas forcément le code. Tout simplement parce que pour accéder aux valeurs de la table (nom des tableaux en Lua), il faut calculer un index à partir de la température. S'il n'y a pas de transformation mathématique évidente entre la température et l'index, tu vas te retrouver à recoder la cascade de if elseif then pour obtenir dans quelle case de la table piocher le coefficient.

La seule optimisation du code Lua cité que je vois est plus pour la lisibilité et éviter la duplication de code.
Après, c'est une question de gout, mais avoir les valeurs proches des conditions permet d'éviter les changements à un endroit mais pas à l'autre. Dans le code original, C03 est défini pour 15-20° mais au final sera utilsé quand T_eau sera de 14.01 :)

Et puis ça donne un morceau supplémentaire de code simple pour comprendre le langage :

Code : Tout sélectionner

	local besoin_filtration = nil

        if (T_eau) > 50 then print("===Calcul du temps de cycle===")
          -- eau à plus de 50° ??? la variable n'est pas changée dans ce cas
 -----------------------------------------------------------------------------------------------------
        elseif (T_eau < 10) then
		-- si <10°
        	besoin_filtration = 0.1*duree_cycle 
---------------------------------------------------------------------------------------------------
        elseif (T_eau < 14.5) then
		-- si 10-14°
        	besoin_filtration = 0.5*duree_cycle 
---------------------------------------------------------------------------------------------------
        elseif (T_eau < 20.5) then
		-- si 15-20°
        	besoin_filtration = 1.0*duree_cycle 
---------------------------------------------------------------------------------------------------
        elseif (T_eau < 28) then
		-- si 21-28°
        	besoin_filtration = 2.0*duree_cycle 
-----------------------------------------------------------------------------------------------------
        else
		-- si >28°
        	besoin_filtration = 3.0*duree_cycle 
-----------------------------------------------------------------------------------------------------
        end
        -- change la variable si besoin_filtration n'est pas nil
        if besoin_filtration then
                    domoticz.variables('Variable:Besoin_filtration').set(besoin_filtration) -- rajouter tostring() si la variable est une chaine de caractères
	end

Re: Transformer un script LUA en DZVETNS

Publié : 17 juil. 2021, 10:11
par kisskool
Du coup je ne sais pas trop à quoi sert la fonction countertoday.
J'ai trouvé une utilisation de counter today que boum avait donné, j'ai bien cru un moment que j'avais ma réponse !
Mais non, si j'ai bien compris il faut que je fasse un compteur que j’incrémente... En lua j'ajoute +1 au compteur a chaque exécution si l’interrupteur est sur ON, vu qu'il s’exécute toute les minutes mais en dzvents...
J'ai fait un test en essayant d’incrémenter à partir d'un exemple donné sur le wiki... ben j'y arrive, je pense qu'il y a des bases que je n'ai pas compris et je ne trouve pas de howto en français permettant de les assimiler, tant pis...

Code : Tout sélectionner

local scriptName = 'Script_PISCINE_DZVENT'
local scriptVersion = '0.01'
local newValue = value
local iCounter = domoticz.devices('Dev_Piscine_tmp')
local counterDivider = 1 

execute = function(domoticz, timer)
			 if domoticz.devices('Sortie_piscine').temperature > domoticz.devices('Entree_piscine').temperature then 
			    domoticz.devices('Filtration piscine').switchOn().forMin(5)
                domoticz.log ('***********************CHOIX 1****************************');
            else
                domoticz.log ('***********************CHOIX 2****************************');
			end
			
			if (device.state(340) == 'On') then
			    iCounter.incrementCounter( ( -1 * iCounter.counter * counterDivider ) + newValue )
				domoticz.log ('Device ' .. device.name .. ' was changed', domoticz.LOG_INFO)
                local valeur = device.counterToday
                local variable = domoticz.variables('Var_Piscine_tmp')
                variable.set(valeur);
			end


	domoticz.log (domoticz.devices('Filtration piscine').counterToday);		
    domoticz.log (domoticz.devices('Sortie_piscine').temperature);
    domoticz.log (domoticz.devices('Entree_piscine').temperature);
    domoticz.log ('***********************fin****************************');
    
end
}

Re: Transformer un script LUA en DZVETNS

Publié : 17 juil. 2021, 18:40
par Keros
Commence à repartir d'un script exemple DzVents, tu auras ainsi la bonne base. Avec la partie des déclencheurs. Si tu ne comprends pas cette partie de déclencheur, tu n'arrives pas à faire des scripts en DzVents.

Re: Transformer un script LUA en DZVETNS

Publié : 20 juil. 2021, 20:44
par kisskool
Je pense que niveau declencheur c'est bon, par exemple dans l'exemple ci-dessous je le lance toutes les minutes (provisoire le temps de tester le script), toutes les 5 minutes, et a chaque changement d'etat de l'interrupteur (340). C'est plus dans le "execute" que je me pose des questions

Code : Tout sélectionner

local scriptName = 'Script_PISCINE_DZVENT'
local scriptVersion = '0.01'

local newValue = value

local counterDivider = 1 -- x is depending on the counter divider set for the device


return {
	on = {
	   	timer = {
	   	    'every 5 minutes at daytime',
			'every minute',
			,
		devices = { 340 }
	},
	
    logging = {
                level   = domoticz.LOG_DEBUG,
                marker	= scriptName..' v'..scriptVersion
   },
execute = function(domoticz, timer)
			 if domoticz.devices('Sortie_piscine').temperature > domoticz.devices('Entree_piscine').temperature then 
			    domoticz.devices('Filtration piscine').switchOn().forMin(5)
                domoticz.log ('***********************CHOIX 1****************************');
            else
                domoticz.log ('***********************CHOIX 2****************************');
			end
			
			if (device.state(340) == 'On') then
			    iCounter.incrementCounter( ( -1 * iCounter.counter * counterDivider ) + newValue )
				domoticz.log ('Device ' .. device.name .. ' was changed', domoticz.LOG_INFO)
                local valeur = device.counterToday
                local variable = domoticz.variables('Var_Piscine_tmp')
                variable.set(valeur);
			end


	domoticz.log (domoticz.devices('Filtration piscine').counterToday);		
    domoticz.log (domoticz.devices('Sortie_piscine').temperature);
    domoticz.log (domoticz.devices('Entree_piscine').temperature);
    domoticz.log ('***********************fin****************************');
    
end
}
LOG

Code : Tout sélectionner

 2021-07-20 20:42:39.219 Status: EventSystem: Script event triggered: /home/joak/domoticz/dzVents/runtime/dzVents.lua
2021-07-20 20:42:39.334 Status: dzVents: Info: Handling events for: "Filtration piscine", value: "On"
2021-07-20 20:42:39.334 Status: dzVents: Info: Script_PISCINE_DZVENT v0.01: ------ Start internal script: Script_Piscine_DzVent: Device: "Filtration piscine (piscine)", Index: 340
2021-07-20 20:42:39.335 Status: dzVents: Debug: Script_PISCINE_DZVENT v0.01: Processing device-adapter for Sortie_piscine: Temperature device adapter
2021-07-20 20:42:39.337 Status: dzVents: Debug: Script_PISCINE_DZVENT v0.01: Processing device-adapter for Entree_piscine: Temperature device adapter
2021-07-20 20:42:39.337 Status: dzVents: Debug: Script_PISCINE_DZVENT v0.01: Constructed timed-command: On
2021-07-20 20:42:39.337 Status: dzVents: Debug: Script_PISCINE_DZVENT v0.01: Constructed timed-command: On FOR 300 SECONDS
2021-07-20 20:42:39.337 Status: dzVents: Info: Script_PISCINE_DZVENT v0.01: ***********************CHOIX 1****************************
2021-07-20 20:42:39.337 Status: dzVents: Info: Script_PISCINE_DZVENT v0.01: ------ Finished Script_Piscine_DzVent
2021-07-20 20:42:39.338 Status: EventSystem: Script event triggered: /home/joak/domoticz/dzVents/runtime/dzVents.lua
2021-07-20 20:42:39.085 Error: dzVents: Error: (3.1.7) Script_PISCINE_DZVENT v0.01: An error occurred when calling event handler Script_Piscine_DzVent
2021-07-20 20:42:39.085 Error: dzVents: Error: (3.1.7) Script_PISCINE_DZVENT v0.01: ...ipts/dzVents/generated_scripts/Script_Piscine_DzVent.lua:104: attempt to index a nil value (global 'device')
2021-07-20 20:42:39.218 Error: dzVents: Error: (3.1.7) Script_PISCINE_DZVENT v0.01: An error occurred when calling event handler Script_Piscine_DzVent

Re: Transformer un script LUA en DZVETNS

Publié : 20 juil. 2021, 21:33
par Keros
Enlève tous les ; il n'y en a pas besoin en LUA.

Dans ton code, tu as :

Code : Tout sélectionner

if (device.state(340) == 'On') then
Cette condition ne correspond pas à la condition que le device 340 passe à On.
Par exemple, lorsque le timer déclenchera ton script, la condition sera validée si le device 340 est à On.

Petit conseil, lorsque tu souhaites avoir plusieurs déclencheurs différents dans un script (Timer et Device), évite d'utiliser execute = function(domoticz, timer) : ça peut porter à confusion. Dans ces cas-là, j'utilise execute = function(domoticz, item). C'est juste le nom de la variable du déclencheur qui change mais ça peut éviter des confusions.
Ensuite tu peux gérer tes déclencheurs avec if item.isTimer then ou if item.isDevice then ou if item.name == 'xxxxxx' then

Re: Transformer un script LUA en DZVETNS

Publié : 21 juil. 2021, 17:13
par kisskool
Je ne comprend pas bien ce que tu veux dire concernant l'interrupteur 340.
Moi ce que je veux faire c'est incrementer un compteur quand l'interrupteur est sur ON pour avoir le temps de fonctionnement quotidien, et remettre à zero le compteur chaque matin. Mais je n'ai pas encore de script qui fasse ça en exemple alors j'essaye de bricoler un truc !
C'est noté pour la variable du declencheur, ca va me permettre d'y voir un chouille plus clair ! Merci

Re: Transformer un script LUA en DZVETNS

Publié : 21 juil. 2021, 17:16
par Keros
La ligne devices = { 340 } déclenche ton script lorsqu'il y a une action sur le device 304. Au vu de tes explications, je pense qu'elle ne te sert à rien.

Edit : que cherches tu as calculé avec iCounter.incrementCounter... ?

Tu pourrais prendre la valeur de ta variable local, y ajouter 1 et tu la restocker.

Re: Transformer un script LUA en DZVETNS

Publié : 22 juil. 2021, 23:24
par kisskool
C'est ce que je fais en LUA, comme il est lancé toutes les minutes c'est facile : si l'interrupteur est ON alors +1.
D'ailleurs j'ai pas mal avancé sur mon script dzvents et il me reste deux choses dans le script LUA avant de le désactiver.
L'incrementation du temps de fonctionnement du compteur.
la mise à zéro du compteur à une heure donnée.

Aussi je n'ai pas trouvé comment déclaré une variable comme ci-dessous:

Code : Tout sélectionner

  elseif (domoticz.devices('Sortie_piscine').temperature) >= 14 and (domoticz.devices('Sortie_piscine').temperature) < 20 then
             domoticz.variables('Var_Piscine_bes').set(C03)
J'aimerais faire :

Code : Tout sélectionner

 
local sortie = (domoticz.devices('Sortie_piscine').temperature)
local besoin = (domoticz.variables('Var_Piscine_bes'))

elseif sortie >= 14 and sortie < 20 then
             besoin.set(C03)
Je n'ai pas trouvé et j'obtiens ça juste en déclarant la variable sortie :
2021-07-22 23:21:31.202 Error: dzVents: Error: (3.1.7) ...ipts/dzVents/generated_scripts/Script_Piscine_DzVent.lua:24: attempt to call a nil value (field 'devices')
:(

Re: Transformer un script LUA en DZVETNS

Publié : 22 juil. 2021, 23:41
par Keros
Mets nous ton script en entier stp, c'est difficile de comprendre avec seulement quelques lignes.