Bug d'un script time en lua suite mise à jour domoticz

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 <\>.
rominic
Messages : 7
Inscription : 23 sept. 2018, 18:23

Bug d'un script time en lua suite mise à jour domoticz

Message par rominic »

Bonjour à tous,

je suis nouveau sur ce forum, mais je le consulte de temps en temps pour m'aider dans mes petits projets avec domoticz.
J'ouvre un sujet car je reste bloqué sur un script écrit par step concernant le AirCan pour la mesure de la qualité de l'air.

J'avais donc suivi à la lettre les indications du projet, tout à fonctionné parfaitement pendant 4, 5 mois, mais depuis le mois d'août dernier et très probablement après avoir appliqué la dernière mise à jour de domoticz Version: 4.9700, j'ai le script time qualité de l'air qui ne fait pas son travail avec le sensor "qualité de l'air" qui ne marche plus, et les LEDs qui ne s'allument plus... par contre touts le restes, y compris les valeurs fonctionnent !

Je ne suis pas assez bon pour comprendre correctement le langage lua et je n'arrive pas à trouver d'où peut venir le problème... si une âme charitable voulait bien jeter un oeil sur le code pour me dire si il y a une erreur je lui en serais très reconnaissant :(

Par ailleurs j'ai une erreur dans les logs "Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_qualite_air_maison.lua: .../domoticz/scripts/lua/script_time_qualite_air_maison.lua:78: attempt to compare number with nil"
Mais il me semble que j'ai toujours eu cette erreur, même lorsque tout fonctionné...

Voila le code complet de stephdes que j'ai très peu modifié :

Code : Tout sélectionner

--[[
name : script_time_qualite_air_maison.lua
auteur : Stef D.
Version : 4.0
date de création : 21/12/2017
Date de mise à jour : 25/04/2018
Principe : Ce script récupère les infos de poussières du capteur SDS011 et les envoie dans les bon customs sensor.
Déduit l'indice de qualité de l'air en fonction des poussières et du CO2 en prenant en compte prioritairement le CO2.
Pilote également les LED intégrées au Air Can avec un interupteur virtuel pour les couper la nuit.
URL du projet : https://easydomoticz.com/forum/viewtopic.php?f=24&t=5520&hilit=MH+Z19#p46591
]]--


--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local pm = 'test AirCan' -- renseigner le nom du device température + humidité utilisé pour l'envoie des infos poussière
local pm10 = 1600 -- renseigner l'idx du device taux de particules
local pm25 = 1601 -- renseigner l'idx du device taux de particules
local qualite = 1602 -- renseigner l'idx du device texte
local ip_sens = '192.168.1.21' -- renseigner l'adresse IP de la AirCan
local co2 = 'CO2 AirCan' -- renseigner le nom de votre dummy sensor utilisé pour la valeur CO2
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------

commandArray = {}
now = os.date("*t")
if now.min%3 == 0 then -- Toutes les 3 minutes

val_PM25, val_PM10, etat1= otherdevices_svalues[pm]:match("([^;]+);([^;]+)")

--print("PM10 : "..val_PM10);
--print("PM2.5: "..val_PM25);

if pm10 ~= nil then
commandArray[1]={['UpdateDevice']= pm10 .. "|0|" .. val_PM10}
end

if pm25 ~= nil then
commandArray[2]={['UpdateDevice']= pm25 .. "|0|" .. val_PM25}
end

val_10 = tonumber(val_PM10)

if (val_10 < 13) then coefpm10 = 1
elseif ( 12 < val_10) and (val_10 < 27) then coefpm10 = 2
elseif ( 26 < val_10) and (val_10 < 34) then coefpm10 = 3
elseif ( 33 < val_10) and (val_10 < 49) then coefpm10 = 4
elseif ( 48 < val_10) and (val_10 < 79) then coefpm10 = 5
elseif ( val_10 > 78) then coefpm10 = 6
end

val_25 = tonumber(val_PM25)

if (val_25 < 23) then coefpm25 = 1
elseif ( 22 < val_25) and (val_25 < 41) then coefpm25 = 2
elseif ( 40 < val_25) and (val_25 < 47) then coefpm25 = 3
elseif ( 46 < val_25) and (val_25 < 58) then coefpm25 = 4
elseif ( 57 < val_25) and (val_25 < 69) then coefpm25 = 5
elseif ( val_10 > 68) then coefpm25 = 6
end

--print("*********************coef PM10 : "..coefpm10)
--print("*********************coef PM2.5 : "..coefpm25)


if (coefpm10 > coefpm25) then val_iqa = coefpm10
elseif (coefpm10 < coefpm25) then val_iqa = coefpm25
else val_iqa = coefpm10
end


val_co2 = tonumber(otherdevices_svalues[co2])
--print(val_co2)


if (val_co2 > 1000) and (val_co2 < 1100) then val_iqa = 3
elseif (val_iqa <= 4) and (val_co2 > 1099) and (val_co2 < 1200) then val_iqa = 4
elseif (val_iqa <= 5) and (val_co2 > 1199) and (val_co2 < 1600) then val_iqa = 5
elseif (val_iqa <= 6) and (val_co2 > 1599) then val_iqa = 6 
end

--print(val_iqa)

if val_iqa == 1 and (otherdevices['OnOffLed'] == 'On') then commandArray[3]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,0,0,255' }
elseif val_iqa == 2 and (otherdevices['OnOffLed'] == 'On') then commandArray[4]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,0,127,255' }
elseif val_iqa == 3 and (otherdevices['OnOffLed'] == 'On') then commandArray[5]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,0,125,0' }
elseif val_iqa == 4 and (otherdevices['OnOffLed'] == 'On') then commandArray[6]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,255,255,0' }
elseif val_iqa == 5 and (otherdevices['OnOffLed'] == 'On') then commandArray[7]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,231,62,1' }
elseif val_iqa == 6 and (otherdevices['OnOffLed'] == 'On') then commandArray[8]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,175,0,0' }
elseif (otherdevices['OnOffLed'] == 'Off') then commandArray[9]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,0,0,0' }
end 


if val_iqa == 1 then texte = 'TRES BON'
elseif val_iqa == 2 then texte = 'BON'
elseif val_iqa == 3 then texte = 'MOYEN'
elseif val_iqa == 4 then texte = 'MEDIOCRE'
elseif val_iqa == 5 then texte = 'MAUVAIS'
elseif val_iqa == 6 then texte = 'TRES MAUVAIS'
end

--print(texte)
commandArray['UpdateDevice'] = qualite..'|0|'..texte


end


return commandArray
Dernière modification par rominic le 02 févr. 2019, 13:22, modifié 1 fois.
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Bug d'un script time en lua suite mise à jour domoticz

Message par denis_brasseur »

Par ailleurs j'ai une erreur dans les logs "Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_qualite_air_maison.lua: .../domoticz/scripts/lua/script_time_qualite_air_maison.lua:78: attempt to compare number with nil"
Mais il me semble que j'ai toujours eu cette erreur, même lorsque tout fonctionné...
Ton erreur provient du fait que tu compare une valeur numerique (number) à une valeur Nulle (nil).
A quoi correspond la ligne 78 dans ton code ?
Tu devrais modifier ton message pour mettre ton code entre les balises code pour plus de lisibilité.

Ca a l'air de correspondre à

Code : Tout sélectionner

if (val_co2 > 1000) and (val_co2 < 1100) then val_iqa = 3
, a vérifier en republiant ton code.

Si c'est bien cette ligne, vérifie la valeur de val_co2.

Ta valeur de coefpm10 n'étant pas initialisé avant tes tests

Code : Tout sélectionner

if (val_10 < 13) then coefpm10 = 1
elseif ( 12 < val_10) and (val_10 < 27) then coefpm10 = 2
elseif ( 26 < val_10) and (val_10 < 34) then coefpm10 = 3
elseif ( 33 < val_10) and (val_10 < 49) then coefpm10 = 4
elseif ( 48 < val_10) and (val_10 < 79) then coefpm10 = 5
elseif ( val_10 > 78) then coefpm10 = 6
end
tu peux te retrouver ici avec val_iqa = nil

Code : Tout sélectionner

if (coefpm10 > coefpm25) then val_iqa = coefpm10
elseif (coefpm10 < coefpm25) then val_iqa = coefpm25
else val_iqa = coefpm10
end[code]
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
rominic
Messages : 7
Inscription : 23 sept. 2018, 18:23

Re: Bug d'un script time en lua suite mise à jour domoticz

Message par rominic »

Bonjour dénis_brasseur et merci pour ton aide !

Alors c'est exactement cette ligne qui génère l'erreur dans les logs.
Comment je peux faire apparaitre la valeur de co2 ? En marquant print(val_co2) rien ne s'affiche dans le log de domoticz...

Par contre au tout début du code, co2 local correspond à CO2 AirCan qui lui reçoit bien des valeurs.
Image
Pièces jointes
Capture d’écran 2019-02-02 à 13.42.26.png
Capture d’écran 2019-02-02 à 13.42.26.png (933.13 Kio) Consulté 4393 fois
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Bug d'un script time en lua suite mise à jour domoticz

Message par denis_brasseur »

Essaye

Code : Tout sélectionner

print("--"..otherdevices_svalues[co2].."--")
tu devrais obtenir la valeur encadré de tiret

Code : Tout sélectionner

--xxxx--
si tu obtiens

Code : Tout sélectionner

----
c'est pas bon
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
rominic
Messages : 7
Inscription : 23 sept. 2018, 18:23

Re: Bug d'un script time en lua suite mise à jour domoticz

Message par rominic »

J'ai ajouté ta ligne de code dans le script time mais je ne vois rien de plus que l'erreur...

C'est bien dans le script que je dois ajouter ton code ?
rominic
Messages : 7
Inscription : 23 sept. 2018, 18:23

Re: Bug d'un script time en lua suite mise à jour domoticz

Message par rominic »

Donc affectivement j'ai modifié le script :

Code : Tout sélectionner

--[[
name : script_time_qualite_air_maison.lua
auteur : Stef D.
co auteur : Romain B.
Version : 4.0
date de création : 21/12/2017
Date de mise à jour : 25/04/2018
Principe : Ce script récupère les infos de poussières du capteur SDS011 et les envoie dans les bon customs sensor.
Déduit l'indice de qualité de l'air en fonction des poussières et du CO2 en prenant en compte prioritairement le CO2.
Pilote également les LED intégrées au Air Can avec un interupteur virtuel pour les couper la nuit.
URL du projet : https://easydomoticz.com/forum/viewtopic.php?f=24&t=5520
]]--


--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local pm = 'test AirCan'             -- renseigner le nom du device température + humidité utilisé pour l'envoie des infos poussière
local pm10 = 1600               -- renseigner l'idx du device taux de particules
local pm25 = 1601               -- renseigner l'idx du device taux de particules
local qualite = 1602         -- renseigner l'idx du device texte
local ip_sens = '192.168.1.21'    -- renseigner l'adresse IP de la AirCan
local co2 = 'CO2 AirCan'                      -- renseigner le nom de votre dummy sensor utilisé pour la valeur CO2
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------

commandArray = {}
 now = os.date("*t")
if now.min%3 == 0 then -- Toutes les 3 minutes

val_PM25, val_PM10, etat1= otherdevices_svalues[pm]:match("([^;]+);([^;]+)")

--print("PM10 : "..val_PM10);
--print("PM2.5: "..val_PM25);

if pm10 ~= nil then
commandArray[1]={['UpdateDevice']= pm10 .. "|0|" .. val_PM10}
end

if pm25 ~= nil then
commandArray[2]={['UpdateDevice']= pm25 .. "|0|" .. val_PM25}
end

val_10 = tonumber(val_PM10)

if (val_10 < 13) then coefpm10 = 1
elseif ( 12 < val_10) and (val_10 < 27) then coefpm10 = 2
elseif ( 26 < val_10) and (val_10 < 34) then coefpm10 = 3
elseif ( 33 < val_10) and (val_10 < 49) then coefpm10 = 4
elseif ( 48 < val_10) and (val_10 < 79) then coefpm10 = 5
elseif ( val_10 > 78) then coefpm10 = 6
end

val_25 = tonumber(val_PM25)

if (val_25 < 23) then coefpm25 = 1
elseif ( 22 < val_25) and (val_25 < 41) then coefpm25 = 2
elseif ( 40 < val_25) and (val_25 < 47) then coefpm25 = 3
elseif ( 46 < val_25) and (val_25 < 58) then coefpm25 = 4
elseif ( 57 < val_25) and (val_25 < 69) then coefpm25 = 5
elseif ( val_10 > 68) then coefpm25 = 6
end

--print("*********************coef PM10 : "..coefpm10)
--print("*********************coef PM2.5 : "..coefpm25)


if (coefpm10 > coefpm25) then val_iqa = coefpm10
elseif (coefpm10 < coefpm25) then val_iqa = coefpm25
else val_iqa = coefpm10
end

val_co2 = tonumber(otherdevices_svalues[co2])
--print(val_co2)

print("--"..otherdevices_svalues[co2].."--")


--[[if (val_co2 > 1000 and val_co2 < 1100) then val_iqa = 3
elseif (val_iqa <= 4) and (val_co2 > 1099) and (val_co2 < 1200) then val_iqa = 4
elseif (val_iqa <= 5) and (val_co2 > 1199) and (val_co2 < 1600) then val_iqa = 5
elseif (val_iqa <= 6) and (val_co2 > 1599) then val_iqa = 6   
end

--print(val_iqa)

if val_iqa == 1 and (otherdevices['OnOffLed'] == 'On') then commandArray[3]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,0,0,255' }
elseif val_iqa == 2 and (otherdevices['OnOffLed'] == 'On') then commandArray[4]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,0,127,255' }
elseif val_iqa == 3 and (otherdevices['OnOffLed'] == 'On') then commandArray[5]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,0,125,0' }
elseif val_iqa == 4 and (otherdevices['OnOffLed'] == 'On') then commandArray[6]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,255,255,0' }
elseif val_iqa == 5 and (otherdevices['OnOffLed'] == 'On') then commandArray[7]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,231,62,1' }
elseif val_iqa == 6 and (otherdevices['OnOffLed'] == 'On') then commandArray[8]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,175,0,0' }
elseif (otherdevices['OnOffLed'] == 'Off') then commandArray[9]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,0,0,0' }
end    


if val_iqa == 1 then texte = 'TRES BON'
elseif val_iqa == 2 then texte = 'BON'
elseif val_iqa == 3 then texte = 'MOYEN'
elseif val_iqa == 4 then texte = 'MEDIOCRE'
elseif val_iqa == 5 then texte = 'MAUVAIS'
elseif val_iqa == 6 then texte = 'TRES MAUVAIS'
end

--print(texte)
commandArray['UpdateDevice'] = qualite..'|0|'..texte
]]--

end


return commandArray
Ce qui me donne dans les logs :
Capture d’écran 2019-02-02 à 16.36.16.png
Capture d’écran 2019-02-02 à 16.36.16.png (185.45 Kio) Consulté 4378 fois
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Bug d'un script time en lua suite mise à jour domoticz

Message par denis_brasseur »

Ta valeur CO2 te remonte 3 valeurs, 762;28;0.

Toutes les conditions suivantes ne sont donc pas valide, la valeur n'étant pas un integer, ce qui explique ton erreur.

Je ne connais pas le fonctionnement du script, ni le contenu des valeurs retournées, mais tu peux utiliser cette méthode.
A adapter ensuite dans le code, en affectant à val_co2 la valeur correspondante.

Code : Tout sélectionner

valeur1, valeur2, valeur3= otherdevices_svalues[co2]:match("([^;]+);([^;]+);([^;]+)")
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
rominic
Messages : 7
Inscription : 23 sept. 2018, 18:23

Re: Bug d'un script time en lua suite mise à jour domoticz

Message par rominic »

En testant plusieurs choses sur le script j'ai fini par résoudre le problème !

Je te remercie beaucoup Denis_brasseur, en effet c'est en modifiant quelque peu ta ligne de code et surtout en l'appliquant au tout début du script que l'erreur à fini par disparaître ! :D
Pour une raison que j'ignore avant la mise à jour de l'été 2018, il n'y avait aucun soucis.

Voici le script corrigé :

Code : Tout sélectionner

--[[
name : script_time_qualite_air_maison.lua
auteur : Stef D.
Mise à jour : Rominic
Version : 4.1
date de création : 21/12/2017
Date de mise à jour : 04/02/2019
Principe : Ce script récupère les infos de poussières du capteur SDS011 et les envoie dans les bon customs sensor.
Déduit l'indice de qualité de l'air en fonction des poussières et du CO2 en prenant en compte prioritairement le CO2.
Pilote également les LED intégrées au Air Can avec un interupteur virtuel pour les couper la nuit.
URL du projet : https://easydomoticz.com/forum/viewtopic.php?f=24&t=5520
]]--


--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local pm = 'test AirCan'             -- renseigner le nom du device température + humidité utilisé pour l'envoie des infos poussière
local pm10 = 1600               -- renseigner l'idx du device taux de particules
local pm25 = 1601               -- renseigner l'idx du device taux de particules
local qualite = 1602         -- renseigner l'idx du device texte
local ip_sens = '192.168.1.21'    -- renseigner l'adresse IP de la AirCan
local co2 = otherdevices_svalues['CO2 AirCan']:match("([^;]+)")  -- renseigner le nom de votre dummy sensor utilisé pour la valeur CO2
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------


commandArray = {}
 now = os.date("*t")
if now.min%3 == 0 then -- Toutes les 3 minutes

val_PM25, val_PM10, etat1= otherdevices_svalues[pm]:match("([^;]+);([^;]+)")

--print("PM10 : "..val_PM10);
--print("PM2.5: "..val_PM25);

if pm10 ~= nil then
commandArray[1]={['UpdateDevice']= pm10 .. "|0|" .. val_PM10}
end

if pm25 ~= nil then
commandArray[2]={['UpdateDevice']= pm25 .. "|0|" .. val_PM25}
end

val_10 = tonumber(val_PM10)

if (val_10 < 13) then coefpm10 = 1
elseif ( 12 < val_10) and (val_10 < 27) then coefpm10 = 2
elseif ( 26 < val_10) and (val_10 < 34) then coefpm10 = 3
elseif ( 33 < val_10) and (val_10 < 49) then coefpm10 = 4
elseif ( 48 < val_10) and (val_10 < 79) then coefpm10 = 5
elseif ( val_10 > 78) then coefpm10 = 6
end

val_25 = tonumber(val_PM25)

if (val_25 < 23) then coefpm25 = 1
elseif ( 22 < val_25) and (val_25 < 41) then coefpm25 = 2
elseif ( 40 < val_25) and (val_25 < 47) then coefpm25 = 3
elseif ( 46 < val_25) and (val_25 < 58) then coefpm25 = 4
elseif ( 57 < val_25) and (val_25 < 69) then coefpm25 = 5
elseif ( val_10 > 68) then coefpm25 = 6
end

--print("*********************coef PM10 : "..coefpm10)
--print("*********************coef PM2.5 : "..coefpm25)


if (coefpm10 > coefpm25) then val_iqa = coefpm10
elseif (coefpm10 < coefpm25) then val_iqa = coefpm25
else val_iqa = coefpm10
end

val_co2 = tonumber(co2)

--print(val_co2)

if (val_co2 > 1000 and val_co2 < 1100) then val_iqa = 3
elseif (val_iqa <= 4) and (val_co2 > 1099) and (val_co2 < 1200) then val_iqa = 4
elseif (val_iqa <= 5) and (val_co2 > 1199) and (val_co2 < 1600) then val_iqa = 5
elseif (val_iqa <= 6) and (val_co2 > 1599) then val_iqa = 6   
end

--print(val_iqa)

if val_iqa == 1 and (otherdevices['OnOffLed'] == 'On') then commandArray[3]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,0,0,255' }
elseif val_iqa == 2 and (otherdevices['OnOffLed'] == 'On') then commandArray[4]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,0,127,255' }
elseif val_iqa == 3 and (otherdevices['OnOffLed'] == 'On') then commandArray[5]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,0,125,0' }
elseif val_iqa == 4 and (otherdevices['OnOffLed'] == 'On') then commandArray[6]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,255,255,0' }
elseif val_iqa == 5 and (otherdevices['OnOffLed'] == 'On') then commandArray[7]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,231,62,1' }
elseif val_iqa == 6 and (otherdevices['OnOffLed'] == 'On') then commandArray[8]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,175,0,0' }
elseif (otherdevices['OnOffLed'] == 'Off') then commandArray[9]={['OpenURL'] = ip_sens..'/control?cmd=NeoPixelAll,0,0,0' }
end    


if val_iqa == 1 then texte = 'TRES BON'
elseif val_iqa == 2 then texte = 'BON'
elseif val_iqa == 3 then texte = 'MOYEN'
elseif val_iqa == 4 then texte = 'MEDIOCRE'
elseif val_iqa == 5 then texte = 'MAUVAIS'
elseif val_iqa == 6 then texte = 'TRES MAUVAIS'
end

--print(texte)
commandArray['UpdateDevice'] = qualite..'|0|'..texte


end


return commandArray
Répondre