Bonjour,
Suite à mon message précédent, j'ai constaté que la valeur n'est pas en PPM mais en AQI, qui est un index de qualité.
De plus, la courbe de conversion n'est pas linéaire, et donc la formule que j'ai appliqué n'est pas la bonne.
Voici le tableau et la bonne formule de conversion.
Tableau AQI Chinois :
BON - AQI 0 à 50 - 0 à 12 µg/m3
MOYEN - AQI 51 à 100 - 12.1 à 35.4 µg/m3
MEDIOCRE - AQI 101 à 150 - 35.5 à 55.4 µg/m3
MAUVAIS - AQI 151 à 200 - 55.5 à 150.4 µg/m3
TRES MAUVAIS - AQI 201 à 300 - 150.5 à 250.4 µg/m3
DANGEREUX - AQI 301 à 400 - 250.5 à 350.4 µg/m3
DANGEREUX - AQI 401 à 500 - 350.5 à 500.4 µg/m3
Formule de conversion PM2.5 en µg/m3 vers AQI Chinois :
Valeurs mesurée en µg/m3 = Y
AQI = [((Y - PM min) * (AQI max - AQI min)) / (PM max - PM min)] + AQI min
Choisir la ligne en fonction de Y dans le tableau ci-dessus
AQI min et max correspond à la plage dans le tableau ci-dessus
PM min et max correspond à la plage dans le tableau ci-dessus en µg/m3
Formule de conversion AQI Chinois vers PM2.5 en µg/m3 :
Valeurs mesurée en AQI = Z
PM2.5 µg/m3 = [((Z - AQI min) * (PM max - PM min)) / (AQI max - AQI min)] + PM min
Choisir la ligne en fonction de Z dans le tableau ci-dessus
AQI min et max correspond à la plage dans le tableau ci-dessus
PM min et max correspond à la plage dans le tableau ci-dessus en µg/m3
exemple AQI=73
PM2.5 µg/m3 = [((73 - 51) * (35.4 - 12.1)) / (100 - 51)] + 12.1
AQI 73 = 22.56 µg/m3 PM2.5
Voici le code LUA Time corrigé :
Code : Tout sélectionner
-- Xiaomi PM2.5.lua
--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local pm = 'Xiaomi PM2.5 - Miio AQI' -- renseigner le nom du device d'origine avec valeurs en ppm
local pm25 = 239 -- renseigner l'idx du device custom sensor taux de particules
local qualite = 240 -- renseigner l'idx du device alert
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
------------------- --------------------
-- Fonction arrondir à deux décimales --
------------------- --------------------
-- Le chiffre"x" (dec or x) correspond au nombre de décimales à prendre en compte dans le resultat
function arrondir(num, dec)
if num == 0 then
return 0
else
local mult = 10^(dec or 2)
return math.floor(num * mult + 0.5) / mult
end
end
------------------- --------------------
---------------- Script ----------------
------------------- --------------------
commandArray = {}
now = os.date("*t")
if now.min%1 == 0 then -- Toutes les 1 minutes
val_PM25 = otherdevices_utility[pm]
if (val_PM25 < 51) then val_PM25_c = arrondir(tonumber((((val_PM25)-0)*(12-0))/(50-0))+0 , 1)
elseif ( 50 < val_PM25) and (val_PM25 < 101) then val_PM25_c = arrondir(tonumber((((val_PM25)-51)*(35.4-12.1))/(100-51))+12.1 , 1)
elseif ( 100 < val_PM25) and (val_PM25 < 151) then val_PM25_c = arrondir(tonumber((((val_PM25)-101)*(55.4-35.5))/(150-101))+35.5 , 1)
elseif ( 150 < val_PM25) and (val_PM25 < 201) then val_PM25_c = arrondir(tonumber((((val_PM25)-151)*(150.4-55.5))/(200-151))+55.5 , 1)
elseif ( 200 < val_PM25) and (val_PM25 < 301) then val_PM25_c = arrondir(tonumber((((val_PM25)-201)*(250.4-150.5))/(300-201))+150.5 , 1)
elseif ( 300 < val_PM25) and (val_PM25 < 401) then val_PM25_c = arrondir(tonumber((((val_PM25)-301)*(350.4-250.5))/(400-301))+250.5 , 1)
elseif ( 400 < val_PM25) and (val_PM25 < 501) then val_PM25_c = arrondir(tonumber((((val_PM25)-401)*(500.4-350.5))/(500-401))+350.5 , 1)
elseif ( val_PM25 > 501) then val_PM25_c = arrondir(tonumber(val_PM25) , 1)
end
print("Xiaomi PM2.5 : PM2.5 = "..val_PM25_c);
if pm25 ~= nil then
commandArray[2]={['UpdateDevice']= pm25 .. "|0|" .. val_PM25_c}
end
if (val_PM25_c < 23) then val_iqa = 1
elseif ( 22 < val_PM25_c) and (val_PM25_c < 41) then val_iqa = 2
elseif ( 40 < val_PM25_c) and (val_PM25_c < 47) then val_iqa = 3
elseif ( 46 < val_PM25_c) and (val_PM25_c < 58) then val_iqa = 4
elseif ( 57 < val_PM25_c) and (val_PM25_c < 69) then val_iqa = 5
elseif ( val_PM25_c > 68) then val_iqa = 6
end
print("Xiaomi PM2.5 : IQA = "..val_iqa)
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
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
-- récupération du texte qualité
recup_texte = otherdevices_svalues['Xiaomi PM2.5 - Qualité']
print("Xiaomi PM2.5 : Qualité = "..texte)
if texte ~= recup_texte then
commandArray['UpdateDevice'] = qualite..'|'..alert..'|'..texte
end
end
return commandArray