DZVENTS : Electrovanne + capteur de pluie fait maison...

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 <\>.
inter-rupteur
Messages : 25
Inscription : 08 oct. 2020, 08:24

DZVENTS : Electrovanne + capteur de pluie fait maison...

Message par inter-rupteur »

Bonjour à tous,

je suis en train de me prendre la tête depuis qq jours à essayer de faire fonctionner mon script. Le script fonctionne à peu prés mais pas comme il faut / faudrait...

Un détecteur de fuite d'eau transformé en capteur de pluie (switch On/Off sous Domoticz). Dés que la pluie arrive et que l'eau touche le capteur, ce dernier m'envoie un "On" : sous Domoticz le switch reste allumé pendant 10 sec puis reviens à son mode par défaut "Off". Dans les logs on se retrouve avec des "On" puis des "Off" en fonction des journées concernées (pluie)... Le reste du temps, il n'y a pas de logs (On/Off) étant donné qu'il ne s'actionne que si il pleut (logique). Et c'est là le souci car je ne sais pas sur quoi me baser... Voici mon script, pour y voir plus clair :

Code : Tout sélectionner


--------------------------------
------ Variables ------
--------------------------------

 local heure = os.date("%H:%M")
 
 local jour = tonumber(os.date("%w"))
 local mois = tonumber(os.date("%m"))
 local annee = tonumber(os.date("%Y"))
 
-- Sunday = 0
-- Monday = 1
-- Tuesday = 2
-- Wednesday = 3 
-- Thursday = 4
-- Friday = 5
-- Saturday = 6
 
 ---------------------------
 -- Fin Variables -- 

return {
    on = 
       {
            timer = 
            { 
                'at 13:00', 
            },
            httpResponses = 
            {
                'WATERInfo',
            },
            devices = 
            {
                'Electrovanne - LOW (ARO-01)',
            },
    
        },
    execute = function(domoticz, item)

        if (item.isTimer) then
            domoticz.openURL({
                url = 'http://localhost:8080/json.htm?type=lightlog&idx=125',
                method = 'GET',
                callback = 'WATERInfo',
            })
        end


        if (item.isHTTPResponse and item.ok) then
            
            local Time = require('Time')
            local results = item.json.result
            local iCount = 0
            local iState = 0
            
            local NowDate = domoticz.time.rawDate
            
            print('***********************************************')
                                 
            for i, node in pairs(results) do
                                 
                local LogDate = node.Date:sub(1,10)
                local lastUpdate = Time(node.lastUpdate)
        
                --print('Hours ago: ' .. lastUpdate.hoursAgo)
                --print('State: ' .. node.Status)
                
               if (node.Status == "On") and (LogDate == NowDate) then 
                    iState = iState + 1
                    
                    print('Status: ' .. node.Status)

                else
                    iCount = iCount + 1
                    print('Status 2: ' .. node.Status)

                    execute = function(domoticz, switch)
                    local ARO01 = domoticz.devices('20.Electrovanne - LOW (ARO-01)')

                       if (switch.state == nil)  then

                           domoticz.devices('ARO01').switchOn().forMin(3)
                           domoticz.log('Electrovanne LOW start, ARO01 est UP pour 3 minutes.',domoticz.LOG_INFO)
                    
                       end
                    end
                end
                    
            end
                    print('Log Time : ' .. LogDate)
                    print('Now Time : ' .. NowDate)
                    print('Il n\'a pas plu depuis : ' .. iCount)
                    print('Il a plu aujourd\'hui : ' .. iState)
                print('***********************************************')
        end
    end
}



Mon problème en faite et que dans les logs, si il y a un "On" automatiquement il y aura un "Off" après (fonctionnement classique d'un switch). Et donc dans mon script, les deux conditions vont matcher.... Ce qui ne va pas.

l'idée : mon script se déclenche tous les jours à 13h. Il vérifie les logs si il y a un / des "On", l'arrosage ne se déclenche pas pour cette journée. Si il n'y a pas de "value" (dans le cas ou il ne pleut pas) car pas de logs, il doit déclencher obligatoirement l'arrosage...
J'espère que c'est clair tout ce que j'ai indiqué....

Merci à vous pour votre aide.
Inter-Rupteur
Dernière modification par inter-rupteur le 10 sept. 2021, 10:59, modifié 1 fois.
inter-rupteur
Messages : 25
Inscription : 08 oct. 2020, 08:24

Re: DZVENTS : capteur de pluie fait maison...

Message par inter-rupteur »

J'ai allégé et remodifié mon script en ajoutant une vérification au niveau du nil ou valeur vide :

Code : Tout sélectionner



--------------------------------
------ Variables ------
--------------------------------

 local heure = os.date("%H:%M")
 
 local jour = tonumber(os.date("%w"))
 local mois = tonumber(os.date("%m"))
 local annee = tonumber(os.date("%Y"))
 
-- Sunday = 0
-- Monday = 1
-- Tuesday = 2
-- Wednesday = 3 
-- Thursday = 4
-- Friday = 5
-- Saturday = 6
 
 ---------------------------
 -- Fin Variables -- 

return {
    on = 
       {
            timer = 
            { 
                'at 13:00', 
            },
            httpResponses = 
            {
                'WATERInfo',
            },
            devices = 
            {
                'Electrovanne - LOW (ARO-01)',
            },
    
        },
    execute = function(domoticz, item)

        if (item.isTimer) then
            domoticz.openURL({
                url = 'http://localhost:8080/json.htm?type=lightlog&idx=125',
                method = 'GET',
                callback = 'WATERInfo',
            })
        end

            local function isempty(s)
              return s == nil or s == ''
            end

        if (item.isHTTPResponse and item.ok) then
            
            local Time = require('Time')
            local results = item.json.result
            local iCount = 0
            local iState = 0
            
            local NowDate = domoticz.time.rawDate
            
            print('***********************************************')
                                 
            for i, node in pairs(results) do
                                 
                local LogDate = node.Date:sub(1,10)
                local lastUpdate = Time(node.lastUpdate)
        
                --print('Hours ago: ' .. lastUpdate.hoursAgo)
                --print('State: ' .. node.Status)
                 
                   if isempty(node.Status) then
                          print('Status: ' .. node.Status)
                    iState = iState + 1
                    
                    execute = function(domoticz, switch)
                    local ARO01 = domoticz.devices('20.Electrovanne - LOW (ARO-01)')
                      
                           domoticz.devices('ARO01').switchOn().forMin(3)
                           domoticz.log('Electrovanne LOW start, ARO01 est UP pour 3 minutes.',domoticz.LOG_INFO)
                    
                    end
                end
                    
            end
                    print('Log Time : ' .. LogDate)
                    print('Now Time : ' .. NowDate)
                    print('Il n\'a pas plu depuis : ' .. iCount)
                    print('Il a plu aujourd\'hui : ' .. iState)
                print('***********************************************')
        end
    end

J'ai cette erreur :
2021-09-06 20:22:00.566 Error: dzVents: Error: (3.1.7) An error occurred when calling event handler capteur-pluie
2021-09-06 20:22:00.566 Error: dzVents: Error: (3.1.7) ...ticz/scripts/dzVents/generated_scripts/capteur-pluie.lua:73: bad argument #1 to 'pairs' (table expected, got nil)
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: DZVENTS : capteur de pluie fait maison...

Message par Keros »

Vu que tu utilises DzVents, regardes les persistent data. Quand ton capteur de pluie passe à On, tu enregistres la valeur dans l'historique du script. Tu as ensuite des fonctions pour faire des calculs.
Plus besoin d'aller regarder et traiter les logs de ton capteur.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
inter-rupteur
Messages : 25
Inscription : 08 oct. 2020, 08:24

Re: DZVENTS : capteur de pluie fait maison...

Message par inter-rupteur »

Yep Keros,

merci pour tes informations et ton retour.

Par contre, j'ai pas tout compris concernant les persistent data. Je commence à coder, et beaucoup de choses m'échappent pour le moment. Je ne sais pas trop comment l'interfacer avec mon script...


Inter-Rupteur
inter-rupteur
Messages : 25
Inscription : 08 oct. 2020, 08:24

Re: DZVENTS : capteur de pluie fait maison...

Message par inter-rupteur »

Bonjour à tous,

sur les conseils de Keros, c 'est à dire me basé sur les persistants Data, j'ai essayé de faire qq chose... Voici le script modifié :

Code : Tout sélectionner

--------------------------------
------ Variables ------
--------------------------------
local Trait = "***********************************************************************"
 ---------------------------
 -- Fin Variables -- 
--------------------------------

return {
    active = true,
    on = {
        timer = 
        {
            'every 1 minutes',
        },   
        
        httpResponses = 
        {
            'WATERInfo',
        },
        
        devices = 
        {
            'Electrovanne - LOW (ARO-01)',
        },
		
	data = 
		{
                  ValOn = { history = true, maxItems = 10 },
		  ValDatOn = { history = true, maxItems = 10 },
	    }
    },
    
    execute = function(domoticz, item)

        if (item.isTimer) then
            domoticz.openURL({
                url = 'http://localhost:8080/json.htm?type=lightlog&idx=125',
                method = 'GET',
                callback = 'WATERInfo',
            })
        end
            
        if (item.isHTTPResponse and item.ok) then
            
            local Time = require('Time')
            local results = item.json.result
            local iCount = 0
            local iState = 0
             
            local NowDate = domoticz.time.rawDate
            
			-- Trait de séparation --
            print(Trait)
                       
            for i, node in pairs(results) do
                   
                local LogDate = node.Date:sub(1,10)
                local lastUpdate = Time(node.lastUpdate)
        
                --print('State: ' .. node.Status)

               if (node.Status == "On") and (LogDate == NowDate) then 
                               
					execute = function(domoticz, value)
					domoticz.data.ValOn.add(node.Status)
					domoticz.data.ValDatOn.add(LogDate)
				end
				
					iState = iState + 1
			   end
			 
				local itValOn = domoticz.data.ValOn.get(1)
				local itValDatOn = domoticz.data.ValDatOn.get(1)

					if (itValOn.data == "On") and (itValDatOn == "NowDate") then
						print(itValOn.data)
						print(itValDatOn.data)
					else
						print('Aucunes Valeurs ')
					
					end			
				   
            end
                    
			    -- Trait de séparation --					
               print(Trait)
				
        end
    end
}

Malheureusement, j'ai des erreurs :
  • 2021-09-07 09:50:00.364 Error: dzVents: Error: (3.1.7) Internal script capteur-pluie.lua has an invalid on = section; please check the wiki. Skipping it until fixed.
  • 2021-09-07 09:50:00.365 Error: dzVents: Error: (3.1.7) ...ticz/scripts/dzVents/generated_scripts/capteur-pluie.lua:77: attempt to index a nil value (field 'data')
  • 2021-09-07 09:50:00.637 Error: dzVents: Error: (3.1.7) Internal script capteur-pluie.lua has an invalid on = section; please check the wiki. Skipping it until fixed.


Inter-Rupteur
inter-rupteur
Messages : 25
Inscription : 08 oct. 2020, 08:24

Re: DZVENTS : capteur de pluie fait maison...

Message par inter-rupteur »

J'ai corrigé les erreurs. Voici le code :

Code : Tout sélectionner

--------------------------------
------ Variables ------
--------------------------------
local Trait = "****************************************************************"
 ---------------------------
 -- Fin Variables -- 
--------------------------------

return {
	active = true,
    
    on = {timer = {'every 1 minutes'}, 
    },
    httpResponses =  {'WATERInfo'},

    devices = {'Electrovanne - LOW (ARO-01)'},

	data = {
          ValOn = { history = true, maxItems = 10 },
		  ValDatOn = { history = true, maxItems = 10 },
    },

    execute = function(domoticz, item)

        if (item.isTimer) then

            domoticz.openURL({
                url = 'http://localhost:8080/json.htm?type=lightlog&idx=125',
                method = 'GET',
                callback = 'WATERInfo',
            })
        end
            
        if (item.isHTTPResponse and item.ok) then
            
            local Time = require('Time')
            local results = item.json.result
            local iCount = 0
            local iState = 0
             
            local NowDate = domoticz.time.rawDate
            
			-- Trait de séparation --
            print(Trait)
                       
            for i, node in pairs(results) do
                   
                local LogDate = node.Date:sub(1,10)
                local lastUpdate = Time(node.lastUpdate)
        
                print('State: ' .. node.Status)

               if (node.Status == "On") and (LogDate == NowDate) then 
                	print('State: ' .. node.Status)
                           
					execute = function(domoticz, node)
					domoticz.data.ValOn.add(node.Status)
					domoticz.data.ValDatOn.add(LogDate)
					
		
				end
				
					iState = iState + 1
			   end
			 
				local itValOn = domoticz.data.ValOn.get(1)
				local itValDatOn = domoticz.data.ValDatOn.get(1)

					if (itValOn == "On") and (itValDatOn == "NowDate") then
						print(itValOn.data)
						print(itValDatOn.data)
					else
						print('Aucunes Valeurs ')
					
					end			
				   
            end
                    
			    -- Trait de séparation --					
               print(Trait)
				
        end
    end
}

Le script se lance bien toutes les minutes, mais aucun résultats..
2021-09-07 11:11:00.263 Status: dzVents: Info: ------ Start internal script: capteur-pluie:, trigger: "every 1 minutes"
2021-09-07 11:11:00.264 Status: dzVents: Info: ------ Finished capteur-pluie
J'ai rajouté des prints par-ci par là, mais rien...
Je vais relancer le service domoticz au cas ou... => fait ! (rien changé...)
J'ai modifié dans la fonction history, "value" par "node"...

toujours pas de résultat...
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: DZVENTS : capteur de pluie fait maison...

Message par Keros »

Alors, voici comment j'utiliserais les persistants Data :

Je mettrais plusieurs triggers dans ton script :
  • Un device avec ton catpeur : ce trigger sera lancé quand ton capteur changera de valeur.
  • Un timer qui permettra de déclencher l'analyse (at 13:00 par exemple)
Dans le bloc lié au trigger device, tu mets une infos dans la persistant data quand ton capteur passe à On.

Dans le bloc lié au trigger timer, tu fais les traitement des persistants data et tu en ressort les infos souhaitées.

Tu n'as plus besoin d'aller chercher les logs du capteur puisque c'est ton script qui stocke les infos dans son historique.

Edit : si besoin, tu peux regarder ce petit guide que j'ai écrit sur le DzVent
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
inter-rupteur
Messages : 25
Inscription : 08 oct. 2020, 08:24

Re: DZVENTS : capteur de pluie fait maison...

Message par inter-rupteur »

Merci Keros,

oui je vois vers quoi tu veux aller. Je suis en train de réfléchir à savoir comment le coder maintenant. Effectivement, le json, là est superflu, vu que je vais avoir mon propre history pour le device...

Ok, je m'y remets et reviens dès que j'ai qq chose.

Merci et merci pour le guide (je vais regarder de suite...)

Inter-Rupteur
inter-rupteur
Messages : 25
Inscription : 08 oct. 2020, 08:24

Re: DZVENTS : capteur de pluie fait maison...

Message par inter-rupteur »

Bon, c'est pas si simple... J'ai écrit ce code mais j'ai une erreur. De plus, je vois aucune données dans les logs quand je fais un print...

Code : Tout sélectionner

return {
    active = true,
    on = 
           {
               devices = {'MD-WATER-01'},
        },
		       data = { valon = { history = true, maxItems = 10 },valdaton = { history = true, maxItems = 10 }},
		       
		--	logging = {level = domoticz.LOG_INFO}
	
        execute = function(domoticz, switch)


            if (switch.state == 'On') then
                domoticz.log('MD-WATER-01 is UP !')
                
                execute = function(domoticz, stateon)
                
                    local NowDate = domoticz.time.rawDate
                    
                    domoticz.data.valon.add(stateon.state)
                    domoticz.data.valdaton.add(stateon.NowDate)
                    
                end
            
                   local itvalon = domoticz.data.valon.get(1)
                   local itvaldaton = domoticz.data.valdaton.get(1)
    
                   print(itvalon.data)
                   print(itvaldaton.data)  
            
           end
        
        end

}

2021-09-08 09:00:06.399 Error: dzVents: Error: (3.1.7) An error occurred when calling event handler test-persist
2021-09-08 09:00:06.399 Error: dzVents: Error: (3.1.7) ...oticz/scripts/dzVents/generated_scripts/test-persist.lua:29: attempt to index a nil value (local 'itvalon')
J'ai pas l'impression que les données rentre dans l'history, ce qui pourrait expliquer l'erreur nil value...
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: DZVENTS : capteur de pluie fait maison...

Message par Keros »

Je vois deux ligne exécute ce qui n'est pas normal.

Première vérification, est-ce que ton script s’exécute quand le capteur change de valeur ? Tu devrais avoir MD-WATER-01 is UP ! dans les logs.

Si tu as des erreurs, fais une sauvegarde de ton script et enlève toutes les autres fonctions. Le but est de procéder par étape > Ok le script fait bien quelque chose quand le capteur change.
Ensuite, tu ajoutes les autres fonctions. Par exemple, tu peux faire un compteur incrémental (tu rajoutes 1 à chaque fois et tu affiches le total). Tu pourra mettre les aspects de temps après. (et pour infos, quand une valeur est stockés dans les persistent data, elle est horodatée : l'info de date et heure sont enregistrées.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Répondre