Page 1 sur 1

Xiaomi PM2.5 dans dmtcz

Publié : 21 mai 2018, 08:48
par irishmat33
Bonjour

Je cherche sans succes a ajouter ma sonde pm2.5 dans domoticz. J ai la gateway que je fais bien remonter mais pas la sonde. Je viens de comprendre que la sonde pm2.5 n est pas prise en charge par la passerelle xiaomi. comment faire :?:

Merci d'avance

Re: Xiaomi PM2.5 dans dmtcz

Publié : 11 juin 2018, 13:41
par tekkharibo
je pense que c'est tout simplement incompatible avec domoticz actuellement comme pas mal de produit xiaomi
ex :
le detecteur de plante est compatible via un plugin
la Xiaomi Philips Bubl n'est pas compatible
...

Re: Xiaomi PM2.5 dans dmtcz

Publié : 21 août 2018, 15:30
par JEANLUC
Voici le plugin pour l’intégrer
Plugin Download: https://github.com/febalci/DomoticzXiaomiPM2.5

Re: Xiaomi PM2.5 dans dmtcz

Publié : 25 mai 2019, 17:21
par gaeldelsart
Bonjour à tous.

Je remercie l'auteur du programme pour intégrer l'appareil dans Domoticz. Cela fonctionne très bien, sous Windows 10 avec python 32bit installé.
Mon Xiaomi PM2.5 refusait de s'inscrire sur l'application android Xiaomi Home malgré l'avoir paramétré en chinois. Maintenant, je peux avoir les informations sur Domoticz.
Néanmoins, il est nécessaire de passer par l'application la première fois pour inscrire le code wifi dans l'appareil, même si une erreur apparaît à la fin. Le wifi sera stocké dans l'appareil, sauf si une réinitialisation est effectué.

Personnellement, j'ai utilisé un script LUA time afin, d'une part, de convertir la valeur de PPM en µg/m3, et d'autre part, afficher la qualité de l'air.
De ce fait, j'ai créé un custom sensor, et un dispositif "alert".
Ensuite, je reprend la valeurs en PPM, et je divise par 2,9. Cela correspond à la masse molaire de l'air (2,8965 g/mol) divisé par 10.

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]
val_PM25_c = arrondir(tonumber(val_PM25) / 2.9 , 1) -- conversion ppm vers µg/m3 en divisant par la masse molaire de l'air /10

print("Xiaomi PM2.5 : PM2.5 = "..val_PM25_c);

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

val_25 = arrondir(tonumber(val_PM25) / 2.9 , 1) -- conversion ppm vers µg/m3 en divisant par la masse molaire de l'air /10

if (val_25 < 23) then val_iqa = 1
elseif ( 22 < val_25) and (val_25 < 41) then val_iqa = 2
elseif ( 40 < val_25) and (val_25 < 47) then val_iqa = 3
elseif ( 46 < val_25) and (val_25 < 58) then val_iqa = 4
elseif ( 57 < val_25) and (val_25 < 69) then val_iqa = 5
elseif ( val_25 > 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
Image
http://www.gaeldelsart.com/easydomoticz ... i_pm25.png

Re: Xiaomi PM2.5 dans dmtcz

Publié : 02 juin 2019, 09:41
par gaeldelsart
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