LUA : Qualité de l’air dans le monde

Vous avez crée 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.
Soyez précis quant aux prérequis, les manips à faire pour que votre bijou fonctionne (des chmod ?, un apt-get à faire ...)
Décrivez précisément son fonctionnement
Placez votre code entre [Quote] et {/Quote]
Répondre
papoo
Messages : 1842
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

LUA : Qualité de l’air dans le monde

Message par papoo » 09 mai 2017, 21:45

Le script qualité de l'air en province utilise l'api du site lcsqa.org qui est assez limitée. je vous propose donc un nouveau script basé sur une nouvelle API, celle du site aqicn.org.
Beaucoup plus puissante, cette API fournie des informations pour une grande partie du globe. De nombreux polluants et données annexes sont disponible, en fonction bien sur des stations du lieu qui vous intéresse.
Real-time Air Quality Index Visual Map.png
Real-time Air Quality Index Visual Map.png (119.12 Kio) Vu 8048 fois
Justement parlons de ce lieu et de la façon de le renseigner dans ce script. L'api permet plusieurs modes de localisation.
la plus simple, basée sur la géolocalisation de votre adresse ip vous donnera la station la plus près de votre DSLAM. si vous êtes dans une ville ne disposant que d'une station, c'est l'option qu'il vous faut.
La géolocalisation via le nom de la ville comme l'option précédente mais permet de monitorer les données d'une ville qui n'est pas votre lieu de résidence (ou si vous passez par un vpn qui change votre ip)
et enfin La géolocalisation via les latitude et longitude pour choisir sa station de mesure (cas des villes disposant de plusieurs stations)

les données des polluants sont au format de l'indice de qualité de l'air commun européen (CAQI)
tableau AQI.png
tableau AQI.png (238.37 Kio) Vu 8056 fois
pour en savoir plus


Cette API utilise une clé gratuite, Il faut donc s’inscrire pour avoir accès à cette clé de 40 caractères
Enregistrez cette clé dans une variable utilisateur et renseignez sont nom dans token_aqicn


script_time_qualite_air.lua

Code : Tout sélectionner

--[[
name : script_time_qualite_air.lua
encodage UTF8 sans BOM
auteur : papoo
date de création : 06/05/2017
Date de mise à jour : 03/03/2018
Principe : Ce script a pour but d'interroger l'API du site http://http://aqicn.org pour récupérer les informations de pollutions
Cette API utilise une clé gratuite, Il faut donc s'incrire sur http://aqicn.org/data-platform/token/  pour avoir accès à cette clé de 40 caractères
Enregistrez cette clé dans une variable utilisateur et renseignez sont nom dans token_aqicn
URL site : https://pon.fr/qualite-de-lair-dans-le-monde/
URL post : https://easydomoticz.com/forum/viewtopic.php?f=17&t=4044 http://pon.fr/qualite-de-lair-dans-le-monde/
url github : https://github.com/papo-o/domoticz_scripts/blob/master/Lua/script_time_qualite_de_lair.lua
Les données des polluants sont au format de l'indice de qualité de l'air commun européen (AQI) http://www.airqualitynow.eu/about_indices_definition.php
--]]
--------------------------------------------
------------ Variables à éditer ------------
-------------------------------------------- 
local nom_script = "Qualité de l\'air"
local version = "1.1"
local debugging = true  			-- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local dev_air_quality = nil			-- renseigner le nom du device Qualité de l'air associé si souhaité, sinon nil (custom, nom de l'axe : AQI)
local dev_indice_alert = nil		-- renseigner le nom du device alert pollution associé si souhaité, sinon nil (dummy - alert)
local dev_poll_dominant = nil		-- renseigner le nom du device polluant dominant associé si souhaité, sinon nil (type text)
local dev_co = nil					-- renseigner le nom du device monoxide de carbonne associé si souhaité, sinon nil (custom, nom de l'axe : AQI)
local dev_no2 = nil					-- renseigner le nom du device dioxyde d'azote associé si souhaité, sinon nil (custom, nom de l'axe : AQI)
local dev_o3 = nil					-- renseigner le nom du device Ozone associé si souhaité, sinon nil (custom, nom de l'axe : AQI)
local dev_p = nil					-- renseigner le nom du device pression atmosphérique  associé si souhaité, sinon nil (barometre)
local dev_pm10 = nil				-- renseigner le nom du device taux de particules associé si souhaité, sinon nil (custom, nom de l'axe : AQI)
local dev_pm25 = nil				-- renseigner le nom du device taux de particules associé si souhaité, sinon nil (custom, nom de l'axe : AQI)
local send_notification = nil 		-- 0: aucune notification, 1: toutes, 2: (50 > Pollution <=100), 3: (100 > Pollution <=150), 4: (150 > Pollution <=200), 5: (Pollution > 200)
local token_aqicn = "api_aqicn" 	-- renseigner le nom de la variable contenant le token aqicn de 40 caractères préalablement créé (variable de type chaine)
--[[ si vous souhaitez une localisation via votre adresse ip laissez les variables ville, latitude, et longitude à nil
	 si vous souhaitez une autre localisation utilisez la variable ville
	 si votre ville comporte plusieurs stations et que vous souhaitez récupérer les informations de la station la plus proche,
	 renseigner vos latitude longitude en laissant ville à nil
]]--
local ville = nil        		-- renseigner le nom de la ville dont vous souhaitez remonter les informations de pollution ex : "limoges", nil si vous souhaitez utiliser Latitude et longitude (plus precis)
local latitude = nil 			-- renseigner la latitude du lieu dont vous souhaitez remonter les informations de pollution ex : "45.84"
local longitude = nil		 	-- renseigner la longitude du lieu dont vous souhaitez remonter les informations de pollution ex : "1.26"

--------------------------------------------
----------- Fin variables à éditer ---------
-------------------------------------------- 
local geo =""
if ville == nil and (latitude == nil or longitude == nil) then geo = 'here' elseif ville ~= nil then geo = ville else geo = 'geo:'.. latitude ..';'.. longitude end
--------------------------------------------
---------------- Fonctions -----------------
-------------------------------------------- 
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
-- json = (loadfile "D:\\domoticz\\scripts\\lua\\json.lua")()  -- For Windows
function voir_les_logs (s, debugging) -- nécessite la variable local debugging
    if (debugging) then 
		if s ~= nil then
        print ("<font color='#f3031d'>".. s .."</font>")
		else
		print ("<font color='#f3031d'>aucune valeur affichable</font>")
		end
    end
end
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------
commandArray = {}
time = os.date("*t")
if ((time.min-1) % 5) == 0 then -- toutes les 5 minutes en commençant par xx:01
	voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)    

    if dev_air_quality then
        dz_air_quality = otherdevices_idx[dev_air_quality]
        if dz_air_quality then voir_les_logs("--- --- --- ".. dev_air_quality .." idx : ".. dz_air_quality,debugging) end
    end
    if dev_indice_alert then
        dz_indice_alert = otherdevices_idx[dev_indice_alert]
        if dz_indice_alert then voir_les_logs("--- --- --- ".. dev_indice_alert .." idx : ".. dz_indice_alert,debugging) end
    end
    if dev_poll_dominant then
        dz_poll_dominant = otherdevices_idx[dev_poll_dominant]
        if dz_poll_dominant then voir_les_logs("--- --- --- ".. dev_poll_dominant .." idx : ".. dz_poll_dominant,debugging) end
    end
    if dev_co then
        dz_co = otherdevices_idx[dev_co]
        if dz_co then voir_les_logs("--- --- --- ".. dev_co .." idx : ".. dz_co,debugging) end
    end    
    if dev_no2 then
        dz_no2 = otherdevices_idx[dev_no2]
        if dz_no2 then voir_les_logs("--- --- --- ".. dev_no2 .." idx : ".. dz_no2,debugging) end
    end    
    if dev_o3 then
        dz_o3 = otherdevices_idx[dev_o3]
        if dz_o3 then  voir_les_logs("--- --- --- ".. dev_o3 .." idx : ".. dz_o3,debugging) end
    end    
    if dev_p then
        dz_p = otherdevices_idx[dev_p]
        if dz_p then voir_les_logs("--- --- --- ".. dev_p .." idx : ".. dz_p,debugging) end
    end
    if dev_pm10 then
        dz_pm10 = otherdevices_idx[dev_pm10]
        if dz_pm10 then voir_les_logs("--- --- --- ".. dev_pm10 .." idx : ".. dz_pm10,debugging) end
    end    
    if dev_pm25 then
        dz_pm25 = otherdevices_idx[dev_pm25]
        if dev_pm25 then voir_les_logs("--- --- --- ".. dev_pm25 .." idx : ".. dz_pm25,debugging) end
    end
    
    
	local API_key = uservariables[token_aqicn] 
    voir_les_logs('--- --- --- /usr/bin/curl -m8 "https://api.waqi.info/feed/'.. geo ..'/?token='.. API_key ..'"',debugging)
	local config=assert(io.popen('/usr/bin/curl -m8 "https://api.waqi.info/feed/'.. geo ..'/?token='.. API_key ..'"'))
    local blocjson = config:read('*all')
	config:close()

	local jsonValeur = json:decode(blocjson)
    if jsonValeur then
        for valeur,i in pairs(jsonValeur.data.iaqi) do
            -- Mise à jour du devise co si il existe et si une valeur est disponible
            if valeur == 'co' then voir_les_logs("--- --- --- co : "..jsonValeur.data.iaqi.co.v .." --- --- --- ",debugging)  
                    if dz_co ~= nil then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_co ..'|0|'.. tostring(jsonValeur.data.iaqi.co.v)} end
            end
            -- Mise à jour du devise no2 si il existe et si une valeur est disponible
            if valeur == 'no2' then voir_les_logs("--- --- --- no2 : "..jsonValeur.data.iaqi.no2.v .." --- --- --- ",debugging)
                    if dz_no2 ~= nil then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_no2 ..'|0|'.. tostring(jsonValeur.data.iaqi.no2.v)} end
            end
             -- Mise à jour du devise o3 si il existe et si une valeur est disponible
            if valeur == 'o3' then voir_les_logs("--- --- --- o3 : "..jsonValeur.data.iaqi.o3.v .." --- --- --- ",debugging)
                    if dz_o3 ~= nil then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_o3 ..'|0|'.. tostring(jsonValeur.data.iaqi.o3.v)} end
            end
            -- Mise à jour du devise p si il existe et si une valeur est disponible
            if valeur == 'p' then voir_les_logs("--- --- --- pression : "..jsonValeur.data.iaqi.p.v .." --- --- --- ",debugging)  
                    if dz_p ~= nil then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_p ..'|0|'.. tostring(jsonValeur.data.iaqi.p.v)} end
            end	
            -- Mise à jour du devise pm10 si il existe et si une valeur est disponible
            if valeur == 'pm10' then voir_les_logs("--- --- --- pm10 : "..jsonValeur.data.iaqi.pm10.v .." --- --- --- ",debugging) 
                     if dz_pm10 ~= nil then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_pm10 ..'|0|'.. tostring(jsonValeur.data.iaqi.pm10.v)} end
            end	
            -- Mise à jour du devise pm25 si il existe et si une valeur est disponible
            if valeur == 'pm25' then voir_les_logs("--- --- --- pm25 : "..jsonValeur.data.iaqi.pm25.v .." --- --- --- ",debugging)  
                    if dz_pm25 ~= nil then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_pm25 ..'|0|'.. tostring(jsonValeur.data.iaqi.pm25.v)} end
            end

        end
    else
        print('la requete Json ne retourne aucun résultat exploitable')
    end    
		-- Mise à jour du devise aqi si il existe
		voir_les_logs("--- --- --- Qualite de l\'air : "..jsonValeur.data.aqi .." --- --- --- ",debugging)
		if dz_air_quality ~= nil then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_air_quality..'|0|'.. tostring(jsonValeur.data.aqi)} end
		-- Mise à jour du devise poll_dominante si il existe
		voir_les_logs("--- --- --- polluant dominant : "..jsonValeur.data.dominentpol .." --- --- --- ",debugging)  
		if dz_poll_dominant ~= nil then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_poll_dominant..'|0|'.. tostring(jsonValeur.data.dominentpol)}end

		local aqi = jsonValeur.data.aqi
		--Mise à jour du devise aqi si il existe	
		if dz_indice_alert ~= nil then	
			if tonumber(aqi) <= 50   then -- niveau 2
				commandArray[#commandArray+1] = {['UpdateDevice'] = dz_indice_alert..'|1|Pas de Pollution'}
				if send_notification > 0 and send_notification < 2 then
				commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte Pollution#Pas de Pollution!'}
				end
				voir_les_logs("--- --- --- Pas de pollution --- --- ---",debugging)

			elseif tonumber(aqi) <= 100   then -- niveau 3
				commandArray[#commandArray+1] = {['UpdateDevice'] = dz_indice_alert..'|2|Polution Faible'}
				if send_notification > 0 and send_notification < 3 then
				commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte Pollution#Pollution Faible!'}
				end
				voir_les_logs("--- --- --- Pollution Faible --- --- ---",debugging)   

			elseif tonumber(aqi) <= 150   then -- niveau 4
				commandArray[#commandArray+1] = {['UpdateDevice'] = dz_indice_alert..'|3|Pollution Forte'}
				if send_notification > 0 and send_notification < 4 then
				commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte Pollution#Pollution Forte!'}
				end
				voir_les_logs("--- --- --- Pollution Forte --- --- ---",debugging)      

			elseif tonumber(aqi) > 150  then -- niveau 5
				commandArray[#commandArray+1] = {['UpdateDevice'] = dz_indice_alert..'|4|Pollution tres forte'}
				if send_notification > 0 and send_notification < 5 then
				commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte Pollution#Pollution tres forte!'}
				end
				voir_les_logs("--- --- --- Pollution très forte --- --- ---",debugging)
			else
				voir_les_logs("niveau non defini")
			end
		end	
	if debugging == true then --affichage des informations disponibles en mod debugging
	aqi = jsonValeur.data.aqi
	url = jsonValeur.data.attributions[1].url
	name = jsonValeur.data.attributions[1].name
	lat_long = jsonValeur.data.city.geo[1]..":"..jsonValeur.data.city.geo[2]
	dominentpol = jsonValeur.data.dominentpol
	city_name = jsonValeur.data.city.name
	city_url = jsonValeur.data.city.url
	local s = jsonValeur.data.time.s
	local tz = jsonValeur.data.time.tz
	local v = jsonValeur.data.time.v
	local h = jsonValeur.data.iaqi.h.v 
	local t = jsonValeur.data.iaqi.t.v 
	if aqi then voir_les_logs("--- --- --- aqi : ".. aqi .." --- --- ---",debugging) end
	if url then voir_les_logs("--- --- --- url : "..url .." --- --- ---",debugging) end
	if name then voir_les_logs("--- --- --- name : ".. name .." --- --- ---",debugging) end
	if lat_long then voir_les_logs("--- --- --- coordonnees gps : ".. lat_long .." --- --- ---",debugging) end
	if city_name then voir_les_logs("--- --- --- city_name : ".. city_name .." --- --- ---",debugging) end
	if city_url then voir_les_logs("--- --- --- city_url : ".. city_url .." --- --- ---",debugging) end
	if dominentpol then voir_les_logs("--- --- --- dominentpol : ".. dominentpol .." --- --- ---",debugging) end
	if s then voir_les_logs("--- --- --- date et heure :".. s .." --- --- ---",debugging) end
	if tz then voir_les_logs("--- --- --- time zone :".. tz .." --- --- ---",debugging) end
	if v then voir_les_logs("--- --- --- timestamp :".. v .." --- --- ---",debugging) end
	if h then voir_les_logs("--- --- --- hygrometrie : ".. h .." --- --- --- ",debugging) end
	if t then voir_les_logs("--- --- --- température :".. t .." --- --- --- ",debugging) end
	end 
	voir_les_logs("========= Fin ".. nom_script .." (v".. version ..") =========",debugging)
	 
	  
end --if time

return commandArray

Fichiers joints
devices-pollutions-Domoticz.png
devices-pollutions-Domoticz.png (94.94 Kio) Vu 8056 fois
Modifié en dernier par papoo le 03 mars 2018, 11:13, modifié 2 fois.
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Chrominator
Messages : 408
Enregistré le : 19 déc. 2015, 07:29

Re: LUA : Qualité de l’air dans le monde

Message par Chrominator » 12 mai 2017, 21:06

Super nickel !

Merci papoo. On peut regretter la rareté des stations en milieu rural (mon cas), mais c'est quand même super d'avoir ce service.
Merci ! :D

Elfnoir
Messages : 13
Enregistré le : 11 avr. 2015, 09:40

Re: LUA : Qualité de l’air dans le monde

Message par Elfnoir » 25 mai 2017, 18:01

Bonjour!
Comment fait-on pour créer les switchs virtuel avec ces logos svp?
Je n'arrive pas à trouver ces icônes dans les menus déroulants lorsque je créé manuellement un interrupteur, sous le matériel de type 'Dummy'.

Une autre question: je ne vois pas où déclarer les idx de ces interrupteurs pour que le script interagisse avec ceux-ci; quel est la 'subtilité' de ce script svp?
Merci par avance pour les réponses!

Chrominator
Messages : 408
Enregistré le : 19 déc. 2015, 07:29

Re: LUA : Qualité de l’air dans le monde

Message par Chrominator » 26 mai 2017, 04:31

:?
Toutes les réponses à tes questions sont présentes dans les commentaires du script ;

Quand tu lis

Code : Tout sélectionner

local dz_air_quality = nil         -- renseigner l'id du device Qualité de l'air associé si souhaité, sinon nil (custom, nom de l'axe : AQI)
Ca veut dire qu'il faut créer un capteur virtuel de type custom sensor, qui aura comme nom d'axe AQI, et que son id devra être écrit en lieu et place du nil sur cette ligne.

Et ceci pour toutes les valeurs que tu veux capter.

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


papoo
Messages : 1842
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : Qualité de l’air dans le monde

Message par papoo » 26 mai 2017, 14:14

@Chrominator : Merci pour le SAV
j'ai modifié légèrement le code pour remplace ID par IDX afin que les nouveaux utilisateurs ne doute pas entre ID et IDX tout deux présents dans domoticz
il s'agit donc bien de l'idx de chaque device préalablement créé qu'il faut renseigner en éditant le script pour le personnaliser
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

vil1driver
Messages : 5089
Enregistré le : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: LUA : Qualité de l’air dans le monde

Message par vil1driver » 26 mai 2017, 14:37

perso je n'utilise plus du tout les idx, c'est plus pratique encore je trouve ;)

Elfnoir
Messages : 13
Enregistré le : 11 avr. 2015, 09:40

Re: LUA : Qualité de l’air dans le monde

Message par Elfnoir » 26 mai 2017, 15:15

Bonjour,

Merci pour ces informations!
Une autre question, désolé je débute...: une fois le script créé dans le répertoir Lua, dans les logs Domoticz j'ai un message d'erreur:

2017-05-26 14:56:00.259 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_qualite_air.lua: /home/pi/domoticz/scripts/lua/script_time_qualite_air.lua:64: attempt to concatenate local 'API_key' (a nil value)

J'ai créer une variable 'token_aqicn" de type Chaîne, avec la valeur de la clé (40 caractères), qui a un l'idx=1, mais je pense que le soucis est ailleurs: dans le script, je pense que le passage sur la définition de la clé doit être celui-ci: "local token_aqicn = "api_aqicn" "

J'ai donc indiqué:
local token_aqicn = "1"
local token_aqicn = 1
local token_aqicn = "91xxxxxxxxxxxxxxxxxxxxxxxxxx" (la clé de 40 caractères)
ou
local token_aqicn = 91xxxxxxxxxxxxxxxxxxxxxxxxxxx
mais rien n'y fait...un petit coup de pouce svp?

Un dernier test réalisé:
en tapant l'adresse dans internet:
https://api.waqi.info/feed/here/?token= ... xxxxxxxxxx
le résultat est:
{"status":"ok","data":{"aqi":34,"idx":5722,"attributions":[{"url":"http://www.airparif.asso.fr/","name":"AirParif - Association de surveillance de la qualité de l'air en Île-de-France"}],"city":{"geo":[48.xxxxxx,2.xxxxxx],"name":"Paris","url":"http://aqicn.org/city/paris/"},"dominen ... 2017-05-26 13:00:00","tz":"+02:00","v":1495803600}}}
Ce qui prouverait que la clé au moins est bonne ;-)

Merci encore!

vil1driver
Messages : 5089
Enregistré le : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: LUA : Qualité de l’air dans le monde

Message par vil1driver » 26 mai 2017, 15:54

Bien lire est important :?

Il n'est pas demandé l'idx de la variable..
Enregistrez cette clé dans une variable utilisateur et renseignez sont nom dans token_aqicn
Mais c'est vrai que c'est tordu :D désolé Papoo
Pourquoi avoir opté pour l'usage d'une variable au lieu de simplement indiquer la clé dans le script ?

papoo
Messages : 1842
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : Qualité de l’air dans le monde

Message par papoo » 26 mai 2017, 19:13

vil1driver a écrit : Mais c'est vrai que c'est tordu :D désolé Papoo
Pourquoi avoir opté pour l'usage d'une variable au lieu de simplement indiquer la clé dans le script ?
Plusieurs raisons :
Lorsque je poste mon script ou le corrige en ligne mes infos Perso ne sont pas copié collé
Certaines api servent pour plusieurs scripts
J'uniformise mes scripts
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

vil1driver
Messages : 5089
Enregistré le : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: LUA : Qualité de l’air dans le monde

Message par vil1driver » 26 mai 2017, 19:44

Ca se défend ;)

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Répondre