[Tuto] AirCan - Mesure qualité de l'air - MISE A JOUR

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
Oui_OuiBlog
Messages : 63
Inscription : 27 juil. 2017, 21:53

Re: [TUTO] AirCan - Mesure qualité de l'air - MISE A JOUR

Message par Oui_OuiBlog »

Je me répond à moi-même, lécran 0.66 pouces ne pose aucun problème

Sinon, ça marche nickel, merci au créateur.

Par contre, le code LUA est à retravailler,
- les réglages d'IQA ont l'air un peu wtf sur les PM2.5 : IQA "moyenne" avec des PM2.5 entre 40 et 47 µg/m3. Le seuil de l'OMS est à 25 µg/m3 sur 24H (50 pour les PM10)
- Le code LUA écrase les valeurs PM si le taux de CO2 dépasse 1000 PPM

Code LUA corrigé (en intégrant les corrections pour l'update domoticz + l'interrupteur LED). La qualité de l'air se base maintenant sur l'indicateur le plus dégradé. Les seuils sont en variable si vous souhaitez les modifier

Code : Tout sélectionner

--[[
name : script_time_qualite_air_maison.lua
auteur : Stef D.
Version : 3.1
date de création : 21/12/2017
Date de mise à jour : 21/12/2017
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.
URL du projet : https://easydomoticz.com/forum/viewtopic.php?f=24&t=5520
]]--


--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local pm = 'XXXX'             -- renseigner le nom du device température + humidité utilisé pour l'envoie des infos poussière
local pm10 = XXX               -- renseigner l'idx du device taux de particules
local pm25 = XXX               -- renseigner l'idx du device taux de particules
local qualite = XXX         -- renseigner l'idx du device texte
local ip_sens = 'XXX.XXX.X.XX   -- renseigner l'adresse IP de la AirCan
local co2 = 'XXXX                    -- renseigner le nom de votre dummy sensor utilisé pour la valeur CO2
local OnOffLed = 'XXXX'                   -- renseigner le nom de l'interrupteur LED

--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------

-- Seuils concentration max : 
-- PM25 / recommandation OMS : < 25 µg/m3 sur 24H (IQA = 3 / moyen)
-- PM10 / recommandation OMS : < 50 µg/m3 sur 24H (IQA = 3 / moyen)
-- CO2 : < 1000 PPM (IQA = 3 / moyen). Pas vraiment de seuil fiable : 400 PPM = normal en extérieur / 1100 PPM tolérable en intérieur / 5000 PPM limite haute pour 8H d'expositon

local Seuil1PM25 = 8
local Seui12PM25 = 13
local Seui13PM25 = 25
local Seui14PM25 = 35
local Seui15PM25 = 50
local Seuil1PM10 = 16
local Seui12PM10 = 26
local Seui13PM10 = 50
local Seui14PM10 = 70
local Seui15PM10 = 100
local Seuil1CO2 = 600
local Seui12CO2 = 800
local Seui13CO2 = 1000
local Seui14CO2 = 2000
local Seui15CO2 = 3000

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

commandArray = {}
 now = os.date("*t")

if now.min%3 == 0 then -- Toutes les 3 minutes

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

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)
val_25 = tonumber(val_PM25)

val_co2 = tonumber(otherdevices_svalues[co2])

if (val_25 > Seui15PM25) or (val_10 > Seui15PM10) or (val_co2 > Seui15CO2) then val_iqa = 6
elseif (val_25 > Seui14PM25) or (val_10 > Seui14PM10) or (val_co2 > Seui14CO2) then val_iqa = 5
elseif (val_25 > Seui13PM25) or (val_10 > Seui13PM10) or (val_co2 > Seui13CO2) then val_iqa = 4
elseif (val_25 > Seui12PM25) or (val_10 > Seui12PM10) or (val_co2 > Seui12CO2) then val_iqa = 3
elseif (val_25 > Seuil1PM25) or (val_10 > Seuil1PM10) or (val_co2 > Seuil1CO2) then val_iqa = 2
else val_iqa = 1
end


if val_iqa == 1 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,0,0,255"')
elseif val_iqa == 2 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,0,127,255"')
elseif val_iqa == 3 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,0,125,0"')
elseif val_iqa == 4 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,180,120,0"')
elseif val_iqa == 5 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,231,62,1"')
elseif val_iqa == 6 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,255,0,0"')
elseif (otherdevices[OnOffLed] == 'Off') then os.execute('curl "'..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
Oui_OuiBlog
Messages : 63
Inscription : 27 juil. 2017, 21:53

Re: [TUTO] AirCan - Mesure qualité de l'air - MISE A JOUR

Message par Oui_OuiBlog »

Et pour le CCS811 ça passe crème. Il se branche en I2C comme l'écran mais avec une autre adresse.

Le plus dur aura été de lui trouver une place dans la boite (mais il n'est pas très gros)

Pas de problème de tension sur un chargeur 2A.

Edit : l'intérieur de l'Aircan est blindé de COV et les résultats renvoyés par le CCS811 sont aberrants. Il est indispensable de mettre le capteur orienté vers l'extérieur (au final je l'ai collé au dessus du capteur de PM avec le capteur de COV orienté vers le grand trou qui sert à l'arrivée d'air du capteur de PM);
stephdes
Messages : 285
Inscription : 06 oct. 2016, 20:50

Re: [TUTO] AirCan - Mesure qualité de l'air - MISE A JOUR

Message par stephdes »

Salut et merci pour ta mise à jour. J'ai pour projet de travailler sur une nouvelle version de ce AirCan mais j'ai tellement d'autre projet que celui-ci tarde à aboutir.

J'ai essayé ton script mais je me trouve avec une erreur que je n'arrive pas à résoudre. Ca fait longtemps que je n'ai pas mis les mains dans le LUA mais j'ai essayé beaucoup de chose sans succès...

J'ai toujours cette erreur : [string "--[[..."]:76: attempt to compare number with nil

La ligne 76 est la suivante : if (val_25 > Seui15PM25) or (val_10 > Seui15PM10) or (val_co2 > Seui15CO2) then val_iqa = 6

Lorsque je lui demande de printer val_10 et val_25 jobtiens pour bien les valeurs :

2021-01-10 16:12:00.343 Status: LUA: PM10 : 39.7
2021-01-10 16:12:00.343 Status: LUA: PM25 : 30

Idem quand je lui demande de printer les seuil, j'ai bien les valeurs et pourtant j'ai toujours la même erreur...

As-tu une piste ?

Merci !
MiniPC W10 + RFXCom 433e + RFLINK
Elec : Téléinfo
Alexa + Alhau
MQTT...
(merci easydomoticz !)
Oui_OuiBlog
Messages : 63
Inscription : 27 juil. 2017, 21:53

Re: [TUTO] AirCan - Mesure qualité de l'air - MISE A JOUR

Message par Oui_OuiBlog »

Salut, je me rappelle moi aussi avoir eu ce type de problème. Il me semble que le code LUA se mélange le spinceaux avec le nom des varaibles SeuilXPMXX. Je l'ai résolu en faisant des copier/coller du nom des variables depuis leur déclaration vers les lignes de code concernées

Je remets mon code finalisé qui tourne sans problème chez moi :

Code : Tout sélectionner

--[[
name : script_time_qualite_air_maison.lua
auteur : Stef D.
Version : 3.1
date de création : 21/12/2017
Date de mise à jour : 21/12/2017
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.
URL du projet : https://easydomoticz.com/forum/viewtopic.php?f=24&t=5520
]]--


--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local pm = 'XXXXXX'       		-- renseigner le nom du device température + humidité utilisé pour l'envoi des infos poussière
local pm10 = XXX               		-- renseigner l'idx du device taux de particules
local pm25 = XXX               		-- renseigner l'idx du device taux de particules
local qualite = XXX  	       		-- renseigner l'idx du device Alerte texte
local qualitenom = 'XXXXXXXX'     -- renseigner le nom du device Alerte texte
local ip_sens = 'XXX.XXX.X.XX'    	-- renseigner l'adresse IP de la AirCan
local co2 = 'XXXXXXXXXXX'            -- renseigner le nom de votre dummy sensor utilisé pour la valeur CO2
local OnOffLed = 'XXXXXXXXX'	-- renseigner le nom de l'interrupteur LED
local CCS = 'XXXXXX'			-- renseigner le nom du device température + humidité utilisé pour l'envoi des infos du CCS 811
local cov = XXX						-- renseigner l'idx du device d'affichage COV

--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------

-- Seuils concentration max : 
-- PM25 / recommandation OMS : < 25 µg/m3 sur 24H (IQA = 3 / moyen)
-- PM10 / recommandation OMS : < 50 µg/m3 sur 24H (IQA = 3 / moyen)
-- CO2 : < 1000 PPM (IQA = 3 / moyen). Pas vraiment de seuil fiable : 400 PPM = normal en extérieur / 1100 PPM tolérable en intérieur / 5000 PPM limite haute pour 8H d'expositon

local Seuil1PM25 = 8
local Seui12PM25 = 13
local Seui13PM25 = 25
local Seui14PM25 = 35
local Seui15PM25 = 50

local Seuil1PM10 = 16
local Seui12PM10 = 26
local Seui13PM10 = 50
local Seui14PM10 = 70
local Seui15PM10 = 100

local Seuil1CO2 = 600
local Seui12CO2 = 800
local Seui13CO2 = 1000
local Seui14CO2 = 2000
local Seui15CO2 = 3000

local Seuil1COV = 100
local Seui12COV = 200
local Seui13COV = 300
local Seui14COV = 400
local Seui15COV = 500


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

commandArray = {}
 now = os.date("*t")


if now.min%1 == 0 then -- Toutes les 1 minutes

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

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

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

if val_TCOV ~= nil then
commandArray[3]={['UpdateDevice']= cov .. "|0|" .. val_TCOV}
end


val_10 = tonumber(val_PM10)
val_25 = tonumber(val_PM25)
val_cov = tonumber(val_TCOV)
val_co2, y, z = otherdevices_svalues[co2]:match("([^;]+);([^;]+)")
val_co2 = tonumber(val_co2)

-- print("PM2.5: " .. val_25)
-- print("PM10 : " .. val_10)
-- print("COV  : " .. val_cov)
-- print("CO2  : " .. val_co2)


if (val_25 > Seui15PM25) or (val_10 > Seui15PM10) or (val_co2 > Seui15CO2) or (val_cov > Seui15COV) then val_iqa = 6
	elseif (val_25 > Seui14PM25) or (val_10 > Seui14PM10) or (val_co2 > Seui14CO2) or (val_cov > Seui14COV) then val_iqa = 5
	elseif (val_25 > Seui13PM25) or (val_10 > Seui13PM10) or (val_co2 > Seui13CO2) or (val_cov > Seui13COV) then val_iqa = 4
	elseif (val_25 > Seui12PM25) or (val_10 > Seui12PM10) or (val_co2 > Seui12CO2) or (val_cov > Seui12COV) then val_iqa = 3
	elseif (val_25 > Seuil1PM25) or (val_10 > Seuil1PM10) or (val_co2 > Seuil1CO2) or (val_cov > Seuil1COV) then val_iqa = 2
	else val_iqa = 1
end

-- print("IQA  : "..val_iqa)

-- if val_iqa == 1 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,0,0,255"')
if val_iqa == 1 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,0,0,0"')
	-- elseif val_iqa == 2 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,0,127,255"')
	elseif val_iqa == 2 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,0,0,0"')
	-- elseif val_iqa == 3 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,0,125,0"')
	elseif val_iqa == 3 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,0,0,0"')
	elseif val_iqa == 4 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,180,120,0"')
	elseif val_iqa == 5 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,231,62,1"')
	elseif val_iqa == 6 and (otherdevices[OnOffLed] == 'On') then os.execute('curl "'..ip_sens..'/control?cmd=NeoPixelAll,255,0,0"')
	elseif (otherdevices[OnOffLed] == 'Off') then os.execute('curl "'..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'
	if val_25 > Seui13PM25 then texte = texte .." PM2.5"
	end
	if val_10 > Seui13PM10 then texte = texte.." PM10"
	end 
	if val_co2 > Seui13CO2 then texte = texte .." CO2"
	end
	if val_cov > Seui13COV then texte = texte .." COV"
	end
elseif val_iqa == 5 then texte = 'MAUVAIS'
	if val_25 > Seui13PM25 then texte = texte .." PM2.5"
	end
	if val_10 > Seui13PM10 then texte = texte.." PM10"
	end 
	if val_co2 > Seui13CO2 then texte = texte .." CO2"
	end
	if val_cov > Seui13COV then texte = texte .." COV"
	end
elseif val_iqa == 6 then texte = 'TRES MAUVAIS'
	if val_25 > Seui13PM25 then texte = texte .." PM2.5"
	end
	if val_10 > Seui13PM10 then texte = texte.." PM10"
	end 
	if val_co2 > Seui13CO2 then texte = texte .." CO2"
	end
	if val_cov > Seui13COV then texte = texte .." COV"
	end
end

-- print("Qualité de l'air : "..texte)

if val_iqa == 1 then alert = '1'
	elseif val_iqa == 2 then alert = '1'
	elseif val_iqa == 3 then alert = '2'
	elseif val_iqa == 4 then alert = '3'
	elseif val_iqa == 5 then alert = '4'
	elseif val_iqa == 6 then alert = '4'
end

recup_texte = otherdevices_svalues[qualitenom]

if texte ~= recup_texte then
	commandArray[4]={['UpdateDevice'] = qualite..'|'..alert..'|'..texte}
end

end
return commandArray
manu663
Messages : 103
Inscription : 06 août 2016, 14:35

Re: [TUTO] AirCan - Mesure qualité de l'air - MISE A JOUR

Message par manu663 »

Bonjour à tous,
Je vais me lancer dans la réalisation de cet Aircan mais malheureusement, les photos ont disparu du forum.
J'ai tenté de reconstituer le schéma de câblage d'après les indications de branchement.
Est-ce quelqu'un pourrait y jeter un coup d’œil et contrôler ce que j'ai fait ?
Air Can.jpg
Air Can.jpg (184.86 Kio) Consulté 4348 fois
S'il est correct je propose de le remettre en page 1 du tuto pour les futures réalisations ?

Merci d'avance !
Dernière modification par manu663 le 25 juil. 2021, 15:25, modifié 1 fois.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Modération

Message par Keros »

En hébergeant les images / documents à l'extérieur du forum, il y a de fort risques qu'ils ne soient plus disponible dans quelque temps comme celles de ce sujet ou ici, ou encore .
Merci d'éditer votre message et utiliser l'onglet Fichiers joints en dessous de la zone d'écriture des messages pour enregistrer les éléments sur le serveur du forum.
manu663
Messages : 103
Inscription : 06 août 2016, 14:35

Re: Modération

Message par manu663 »

Fait !
Merci pour la piqûre de rappel, Keros, les bonnes habitudes se perdent vite ! :oops:
Dernière modification par Keros le 25 juil. 2021, 15:56, modifié 1 fois.
Raison : Merci de ne pas citer le message précédent lors d'une réponse directe
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [TUTO] AirCan - Mesure qualité de l'air - MISE A JOUR

Message par Keros »

Ce n'est pas grave, merci d'avoir corrigé ;)
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
manu663
Messages : 103
Inscription : 06 août 2016, 14:35

Re: [TUTO] AirCan - Mesure qualité de l'air - MISE A JOUR

Message par manu663 »

download/file.php?id=9033
Schéma Air Can
Bonjour à tous,

Je profite de la rentrée et de la hausse de fréquentation du forum pour un petit up ?
(je ne cite que l'image !!!)

Manu
Oui_OuiBlog
Messages : 63
Inscription : 27 juil. 2017, 21:53

Re: [TUTO] AirCan - Mesure qualité de l'air - MISE A JOUR

Message par Oui_OuiBlog »

Je n'ai pas vérifié le schéma mais les branchements sont définis sur le post initial (j'ai monté le mien uniquement sur la base de ces infos). Tu peux juste t'assurer que c'est cohérent.

Par ailleurs, le schéma n'est pas très facile à utiliser puisqu'en pratique tu regroupe le 3V, le 5V et le Gnd sur une platine dédiée

Bon montage
Répondre