Besoin d'aide débug script

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 <\>.
stephdes
Messages : 285
Inscription : 06 oct. 2016, 20:50

Besoin d'aide débug script

Message par stephdes »

Bonjour à tous,

Je fais un peu de maintenance sur mon Domoticz et j'essaie de remettre en fonctionnement des scripts qui ne marchent plus depuis une mise à jour.

Aujourd'hui, je n'arrive pas à faire fonctionner le script de Papoo sur l'alerte givre.

Voici ce que j'obtiens après plusieurs essais :

Status: LUA: =========== Point de rosée et point de givrage (v1.2) ===========
Status: LUA: --- --- --- Température Ext : 9.2
Status: LUA: --- --- --- Humidité : 63
Error: EventSystem: in Alerte Givre: attempt to compare string with number

Et voici le script :

Code : Tout sélectionner

--[[   
~/domoticz/scripts/lua/script_device_givre.lua
auteur : papoo
MAJ : 28/02/2018
création : 06/05/2016
Principe :
Calculer via les informations température et hygrométrie d'une sonde extérieure
 le point de rosée ainsi que le point de givre
puis en comparant ensuite le point de givre et l'a température extérieure, création d'une alerte givre.
http://pon.fr/script-calcul-et-alerte-givre/
http://easydomoticz.com/forum/viewtopic.php?f=21&t=1085&start=10#p17545
https://github.com/papo-o/domoticz_scripts/blob/master/Lua/script_device_givre.lua
--]]

--------------------------------------------
------------ Variables à éditer ------------
-------------------------------------------- 

local debugging = true  					-- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local temp_ext  = 'Température Extérieure' 	-- nom de la sonde de température/humidité extérieure
local dev_dew_point = 'Température point de rosée' 	-- nom de l'éventuel dummy température point de rosée si vous souhaitez le suivre sinon nil
local dev_freeze_point = nil	-- nom de l'éventuel dummy température point de givre si vous souhaitez le suivre sinon nil
local dev_hum_abs_point = nil -- nom de l'éventuel dummy humidité absolue si vous souhaitez le suivre sinon nil
local dev_freeze_alert = 'Risque de givre'	-- nom de l'éventuel dummy alert point de givre si vous souhaitez le suivre sinon nil

--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
local nom_script = 'Point de rosée et point de givrage'
local version = 1.2						-- version du script

commandArray = {}

--------------------------------------------
---------------- Fonctions -----------------
-------------------------------------------- 
-- package.path = package.path..";/home/pi/domoticz/scripts/lua/fonctions/?.lua"   -- ligne à commenter en cas d'utilisation des fonctions directement dans ce script
-- require('fonctions_perso')                                                      -- ligne à commenter en cas d'utilisation des fonctions directement dans ce script

-- ci-dessous les lignes à décommenter en cas d'utilisation des fonctions directement dans ce script( supprimer --[[ et --]])
function voir_les_logs (s, debugging) -- nécessite la variable local debugging
    if (debugging) then 
		if s ~= nil then
        print (s)
		else
		print ("aucune valeur affichable")
		end
    end
end	-- usage voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)

--------------------------------------------
function round(value, digits)
	if not value or not digits then
		return nil
	end
		local precision = 10^digits
		return (value >= 0) and
		  (math.floor(value * precision + 0.5) / precision) or
		  (math.ceil(value * precision - 0.5) / precision)
end

function dewPoint (T, RH)
	local b,c = 17.67, 243.5
	RH = math.max (RH or 0, 1e-3)
	local gamma = math.log (RH/100) + b * T / (c + T) 
	return c * gamma / (b - gamma)
end
function freezing_point(dp, t) 
	if not dp or not t or dp > t then
    return nil, " La température du point de rosée est supérieure à la température. Puisque la température du point de rosée ne peut être supérieure à la température de l'air , l\'humidité relative a été fixée à nil."
end

T = t + 273.15
Td = dp + 273.15
return (Td + (2671.02 /((2954.61/T) + 2.193665 * math.log(T) - 13.3448))-T)-273.15
  
end

function hum_abs(t,hr)
-- https://carnotcycle.wordpress.com/2012/08/04/how-to-convert-relative-humidity-to-absolute-humidity/
-- Formule pour calculer l'humidité absolue
-- Dans la formule ci-dessous, la température (T) est exprimée en degrés Celsius, l'humidité relative (hr) est exprimée en%, et e est la base des logarithmes naturels 2.71828 [élevée à la puissance du contenu des crochets]:
-- Humidité absolue (grammes / m3 ) =  (6,122 * e^[(17,67 * T) / (T + 243,5)] * rh * 2,1674))/(273,15 + T)
-- Cette formule est précise à 0,1% près, dans la gamme de température de -30 ° C à + 35 ° C
ha = round((6.112 * math.exp((17.67 * t)/(t+243.5)) * hr * 2.1674)/ (273.15 + t),1)
return ha
end

--------------------------------------------
-------------- Fin Fonctions ---------------
-------------------------------------------- 

time=os.date("*t")
if time.min % 2 == 0 then  -- si script_time
--if devicechanged[temp_ext] then  -- si script_device
print("script_device_givre.lua")

    voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)
    Temp, Humidity = otherdevices_svalues[temp_ext]:match("([^;]+);([^;]+)")		
    voir_les_logs("--- --- --- Température Ext : ".. Temp,debugging)
    voir_les_logs("--- --- --- Humidité : ".. Humidity,debugging)

	if dev_dew_point ~= nil then
		DewPoint = round(dewPoint(Temp,Humidity),2)
		voir_les_logs("--- --- --- Point de Rosée : ".. DewPoint,debugging)
		commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[dev_dew_point] .. "|0|" .. DewPoint} -- Mise à jour point de rosée
    end    
    if  dev_freeze_point ~= nil then   
		FreezingPoint = round(freezing_point(DewPoint, tonumber(Temp)),2)
		voir_les_logs("--- --- --- Point de Givrage : ".. FreezingPoint,debugging)
		commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[dev_freeze_point] .. "|0|" .. FreezingPoint} -- Mise à jour point de givrage
	end

    if  dev_hum_abs_point ~= nil then   
        hum_abs_point = hum_abs(Temp, Humidity)
		voir_les_logs("--- --- --- Humidité absolue : ".. hum_abs_point,debugging)
		commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[dev_hum_abs_point] .. "|0|" .. hum_abs_point} -- Mise à jour humidité absolue
	end    
    
    
    if dev_freeze_alert ~= nil then
        if(tonumber(Temp)<=1 and tonumber(FreezingPoint)<=0)  then
            voir_les_logs("--- --- --- Givre --- --- ---",debugging)
            commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[dev_freeze_alert]..'|4|'..FreezingPoint}
            if (time.min == 50 and time.hour == 6) then
            commandArray['SendNotification'] = 'Alert#Présence de givre!'
            end
        elseif(tonumber(Temp)<=3 and tonumber(FreezingPoint)<=0)then
            voir_les_logs("--- --- --- Risque de Givre --- --- ---",debugging)
            commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[dev_freeze_alert]..'|2|'..FreezingPoint}
            if (time.min == 50 and time.hour == 6) then
            commandArray['SendNotification'] = 'Alert#Risque de givre!'
            end
        else
            voir_les_logs("--- --- --- Aucun risque de Givre --- --- ---",debugging)
            commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[dev_freeze_alert]..'|1|'..'Pas de givre'}
        end
    end
voir_les_logs("========= Fin ".. nom_script .." (v".. version ..") =========",debugging)
end	

return commandArray

A votre avis ?

Merci de votre aide !
MiniPC W10 + RFXCom 433e + RFLINK
Elec : Téléinfo
Alexa + Alhau
MQTT...
(merci easydomoticz !)
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Besoin d'aide débug script

Message par Keros »

Le souci est que la ligne Error: EventSystem: in Alerte Givre: attempt to compare string with number nous fait chercher une aiguille dans une botte de foin : on n'a même pas l'indication de la ligne qui génère cette erreur.

Il faudrait que tu rajoutes des infos de débogage pour trouver d’où ça vient. Regarde dans ma signature, j'ai écrit un petit guide pour aider au débogage.
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
stephdes
Messages : 285
Inscription : 06 oct. 2016, 20:50

Re: Besoin d'aide débug script

Message par stephdes »

J'ai isolé le problème.

Cela vient de cette partie :

Code : Tout sélectionner

	if dev_dew_point ~= nil then
		DewPoint = round(dewPoint(Temp,Humidity),2)
		voir_les_logs("--- --- --- Point de Rosée : ".. DewPoint,debugging)
		commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[dev_dew_point] .. "|0|" .. DewPoint} -- Mise à jour point de rosée
ou de la fonction à laquelle il renvoie :

Code : Tout sélectionner

function dewPoint (T, RH)
	local b,c = 17.67, 243.5
	RH = math.max (RH or 0, 1e-3)
	local gamma = math.log (RH/100) + b * T / (c + T) 
	return c * gamma / (b - gamma)
end
Lorsque je passe dev_dew_point à nil le script s'exécute correctement
MiniPC W10 + RFXCom 433e + RFLINK
Elec : Téléinfo
Alexa + Alhau
MQTT...
(merci easydomoticz !)
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Besoin d'aide débug script

Message par denis_brasseur »

dev_dew_point correspond au nom de l'éventuel dummy température point de rosée si vous souhaitez le suivre sinon nil
Par défaut dans le script, celui ci s'appelle 'Température point de rosée'.
Si le dummy n'existe pas il doit être à nil
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
stephdes
Messages : 285
Inscription : 06 oct. 2016, 20:50

Re: Besoin d'aide débug script

Message par stephdes »

Oui, c'est exact. Le Dummy existe et n'est d'ailleurs plus à jour depuis que j'ai mis à jour Domoticz. Ce qui est donc étrange.

Mais je penche pour une erreur de syntaxe quelque part mais où...
Dernière modification par Keros le 23 mars 2022, 18:33, modifié 1 fois.
Raison : Merci de ne pas citer le message précédent lors d'une réponse directe
MiniPC W10 + RFXCom 433e + RFLINK
Elec : Téléinfo
Alexa + Alhau
MQTT...
(merci easydomoticz !)
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Besoin d'aide débug script

Message par Keros »

Essaye de faire un autre script avec ta fonction pour tester ta fonction. Tu récupères les deux infos Temp et Humidity que tu rentres avec des variables et tu vois si le calcul se fait ou pas.
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