LUA : Qualité de l'air dans les Hauts de France

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]
Chrominator
Messages : 583
Enregistré le : 19 déc. 2015, 07:29
Localisation : France

Re: LUA : Qualité de l'air dans les Hauts de France

Message par Chrominator »

Le script fonctionne toujours.
L'erreur signifie qu'il y a un souci avec la station choisie.

Est-ce que cette station affiche des résultats sur http://www.atmo-hdf.fr/acceder-aux-donn ... tions.html ?

exemple en cliquant sur la carte :
Screenshot_2020-01-03 Atmo Hauts-de-France - Mesures des stations de surveillance de la qualité de l'air.png
Screenshot_2020-01-03 Atmo Hauts-de-France - Mesures des stations de surveillance de la qualité de l'air.png (183.89 Kio) Vu 1145 fois
Partir, c’est pourrir un pneu.

Ubuntu 20.04 LTS - Domoticz v2020.2
rfxcom RFXtrx433 USB Version: Ext2/1025
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway with LAN interface 48.4

Chrominator
Messages : 583
Enregistré le : 19 déc. 2015, 07:29
Localisation : France

Re: LUA : Qualité de l'air dans les Hauts de France

Message par Chrominator »

En complément, le nom des particules polluantes a été modifié par le site le 12/12/19 ;
De Particules (PM10) et Particules (PM2.5) on est passé maintenant à Particules PM10 et Particules PM2.5 ce qui générait l'erreur : lua:141: bad argument #2 to 'sub' (number expected, got nil).

Il faut juste remplacer le nouveau nom donné aux particules dans le script (lignes 355 et 368).

J'ai mis à jour le script du premier post avec cette mise à jour.
Partir, c’est pourrir un pneu.

Ubuntu 20.04 LTS - Domoticz v2020.2
rfxcom RFXtrx433 USB Version: Ext2/1025
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway with LAN interface 48.4

rito
Messages : 9
Enregistré le : 21 oct. 2019, 18:30

Re: LUA : Qualité de l'air dans les Hauts de France

Message par rito »

Merci pour cette réponse très rapide!
La station remonte bien l information (amiens) et j ai essayé avec celle de St omer qui selon le post fonctionne et me donne la même erreur
J ai mis un rafraîchissement d 1 minute et ça m affiche toujours l erreur

J ai essayé d installer le script dans le répertoire script /lua et dans l onglet événement directement dans domoticz (fonction Time)
Quelle est la meilleure façon ?

Encore merci

balajol
Messages : 743
Enregistré le : 13 nov. 2015, 18:54
Localisation : 62

Re: LUA : Qualité de l'air dans les Hauts de France

Message par balajol »

Bonsoir, Meilleurs Voeux à Tous,
Merci Chrominator pour cette Mise à Jour :)
Après ces modifications, le script fonctionne de nouveau. (Je pensais ces derniers jours que la station était HS)
Pollution.JPG
Pollution.JPG (117.62 Kio) Vu 1111 fois
@Rito Voici ma version du script (Sous Windows)

Code : Tout sélectionner

--#!/usr/bin/lua                                   https://easydomoticz.com/forum/viewtopic.php?p=68282#p68282
--[[
	Script récoltant les données des polluants mesurés dans une ville des Hauts de France

 Auteur : Chrominator (quelques morceaux de code viennent du script_time_qualite_air.lua et ont pour auteur papoo)
 cf https://easydomoticz.com/forum/viewtopic.php?f=17&t=4044&hilit=script_time_qualite_air.lua
 
 Version 1.0
 Changes :
           2017-09-09 : Initial version
		   2017-09-27 : Warn only in case of index change + detail of pollutant indexes sent in notification
		   2017-10-27 : Exit if no pollutant is available from the station
		   2019-04-04 : stations document moved from http to https - changed.
		   
 TODO : Convert in European Citeair indexes on demand
		Ability to use several stations in order to get all pollutants.

 Principe :
 Récupération de la page affichant les mesures des Hauts de France http://www.atmo-hdf.fr/acceder-aux-donnees/mesures-des-stations.html
 La page est téléchargée, elle contient toutes les mesures de toutes les stations
 puis focus sur la station ciblée parmi les suivantes :
 
1134 Saint-Amand-les-Eaux
1027 Gravelines Les Huttes
1052 Gravelines Petit-Fort-Philippe
1079 Noeux-les-Mines
1114 Wattignies
1115 Lens Varsovie
1137 Boulogne-sur-Mer
1138 Lille Leeds
1539 Amiens 14 Juillet.
1536 Hirson
1541 Saint-Quentin Victor Hugo
1139 Isbergues					[Aucun polluant mesuré]
1523 Arrest
1534 Beauvais Aéroport
1527 Creil
1509 Nogent sur Oise
1530 Rieux
1526 Saint-Quentin Stade
1529 Roye
1519 Salouël
1125 Saint-Laurent-Blangy
1110 Béthune Stade
1049 Outreau
1047 Sangatte
1120 Calais Berthelot
1126 Calais Parmentier
1009 Cambrai
1029 Dunkerque Port
1030 Malo-les -Bains
1038 Mardyck
1039 Loon-Plage
1118 Gravelines PC/Drire
1127 Cappelle-la-Grande
1129 Grande-Synthe
1003 Douai Theuriet
1093 Harnes
1131 Lens Stade
1007 Maubeuge
1065 Lille Fives
1073 Roubaix Serres
1067 Tourcoing
1059 Marcq-en-Baroeul
1066 Halluin
1051 Saint Omer

Chaque polluant est comparé aux seuils définissant l'indice de pollution.
1 = Très bon	10 = Très mauvais
L'indice le plus haut parmi SO² NO² O³ et PM10 procure l'indice de qualité de l'air.

]]---------------------------------------------------------------------------------------------------


--variables à modifier----------------

-- Renseigner le chemin vers votre cURL
-- OSx : à définir
if package.config:sub(1,1) == '\\' then curl = "C:/curl-7.50.3-win32-mingw/bin/curl.exe" 	-- Windows
else curl = "/usr/bin/curl"																		-- Linux
end

-- n° de la station qui mesure la qualité de l'air
-- (Voir valeur dans les commentaires ci-dessus)

local station = 1051			-- Le code de votre station sans les < >

local NO2_indice = 0
local O3_indice = 0
local PM10_indice = 0
local PM25_indice = 0
local SO2_indice = 0
local poldom = "SO2"
local laps = 3						-- Nombre d'heures au terme desquelles on ne met plus à jour domoticz (la mesure est trop ancienne).

local dz_air_quality = 1020         	-- renseigner l'id du device Qualité de l'air associé si souhaité, sinon nil (custom, nom de l'axe : Atmo)
local dz_poll_dominant = nil        -- renseigner l'id du device polluant dominant associé si souhaité, sinon nil (type text)
local dz_indice_alert = 1025         -- renseigner l'id du device alert pollution associé si souhaité, sinon nil (dummy - alert)
local dz_so2 = nil               	-- renseigner l'id du device dioxyde de soufre associé si souhaité, sinon nil (custom, nom de l'axe : µg/m³)
local dz_no2 = 1022               	-- renseigner l'id du device dioxyde d'azote associé si souhaité, sinon nil (custom, nom de l'axe : µg/m³)
local dz_no = 1033               	-- renseigner l'id du device monoxyde d'azote associé si souhaité, sinon nil (custom, nom de l'axe : µg/m³)
local dz_o3 = 1024                  	-- renseigner l'id du device Ozone associé si souhaité, sinon nil (custom, nom de l'axe : µg/m³)
local dz_pm10 = 1021               	-- renseigner l'id du device taux de particules associé si souhaité, sinon nil (custom, nom de l'axe : µg/m³)
local dz_pm25 = nil               	-- renseigner l'id du device taux de particules associé si souhaité, sinon nil (custom, nom de l'axe : µg/m³)
local dz_city_name = 1023         	-- renseigner l'idx du device city_name associé si souhaité, sinon nil (type text)
local send_notification = 10       	-- 0: aucune notification, 1: toutes, 4: Bon, 5: Moyen, 7: Médiocre, 9: Mauvais, 10: Très mauvais

DEBUG = false

function voir_les_logs (s) -- nécessite la variable DEBUG
    if DEBUG then
      if s ~= nil then
        print ("<font color='#f3031d'>".. s .."</font>")
      else
        print ("<font color='#f3031d'>aucune valeur affichable</font>")
      end
    end
end

-- Decode les paramètres de la station ou de la mesure

function DecodeParm(chaine, parm)
	-- Renvoie la valeur du parametre 
	i, j = string.find(chaine, '"'..parm..'"')
	k, l = string.find(chaine, ':"', j)
	if k == nil then return nil end
	m, n = string.find(chaine, '","', j)
	if m == nil then 
		m, n = string.find(chaine, '"}', j)
	end
	return string.sub(chaine, l+1, m-1)
end

-- Recherche la mesure du polluant et renvoie les valeurs mesurées

function DecodePol(chaine, pol)
	cherche='"NCON":"'..pol..'",'
	-- Renvoie les informations du polluant
	i, j = string.find(chaine, cherche)
	k, l = string.find(chaine, '},', j)
	poluant = string.sub(chaine, j, k)
--	voir_les_logs(poluant)
	return DecodeParm(poluant, "J_DATE"), DecodeParm(poluant, "UNITE"), DecodeParm(poluant, "value")
end

-- Transforme les caractères unicodes en caractères lisibles.

function Unicode(chaine)
	chaine = string.gsub(chaine, "\\u00e0", "à")
	chaine = string.gsub(chaine, "\\u00e2", "â")
	chaine = string.gsub(chaine, "\\u00e4", "ä")
	chaine = string.gsub(chaine, "\\u00e7", "ç")
	chaine = string.gsub(chaine, "\\u00e8", "è")
	chaine = string.gsub(chaine, "\\u00e9", "é")
	chaine = string.gsub(chaine, "\\u00ea", "ê")
	chaine = string.gsub(chaine, "\\u00eb", "ë")
	chaine = string.gsub(chaine, "\\u00ee", "î")
	chaine = string.gsub(chaine, "\\u00ef", "ï")
	chaine = string.gsub(chaine, "\\u00f4", "ô")
	chaine = string.gsub(chaine, "\\u00f6", "ö")
	chaine = string.gsub(chaine, "\\u00f9", "ù")
	chaine = string.gsub(chaine, "\\u00fb", "û")
	chaine = string.gsub(chaine, "\\u00fc", "ü")
	return chaine
end

-- Fonction déterminant l'indice du polluant

function AttribueIndice(pol, idx)
	for i=10, 1, -1 do
		if tonumber(pol) <= idx[i] then
			indice = i
		end
	end
	return indice
end

-- Vérifie que la mesure n'est pas trop ancienne, pour décider de mettre à jour Domoticz ou pas.

function CheckLapse(DATE, outdated)
		p="(%d+)-(%d+)-(%d+) (%d+):(%d+)"
		year,month,day,hour,min=DATE:match(p)
		horodatage = os.time({year=year,month=month,day=day,hour=hour,min=min})
		voir_les_logs(os.date("%c", horodatage))
		timelapse = os.time()-horodatage
		voir_les_logs("Dernière mesure il y a "..tostring(timelapse).." secondes ("..os.date("%H", timelapse-3600).." heures "..os.date("%M", timelapse-3600).." minutes).")
		if timelapse > 3600*outdated then return false
		else return true
		end
end

commandArray = {}


time = os.date("*t")
if time.min %15 == 0 then 		-- tous les 1/4 d'heure

	--[[
		Seuils de l’indice français Atmo
		Valeurs obtenues sur http://www.atmo-hdf.fr/tout-savoir-sur-l-air/indice-de-la-qualite-de-l-air.html
	--]]

	-- Dioxyde de soufre (SO2)
	SO2_idx = {}
	SO2_idx[1]=39
	SO2_idx[2]=79
	SO2_idx[3]=119
	SO2_idx[4]=159
	SO2_idx[5]=199
	SO2_idx[6]=249
	SO2_idx[7]=299
	SO2_idx[8]=399
	SO2_idx[9]=499
	SO2_idx[10]=9000

	-- Poussières en suspension (PM10)
	PM10_idx = {}
	PM10_idx[1]=6
	PM10_idx[2]=13
	PM10_idx[3]=20
	PM10_idx[4]=27
	PM10_idx[5]=24
	PM10_idx[6]=41
	PM10_idx[7]=49
	PM10_idx[8]=64
	PM10_idx[9]=79
	PM10_idx[10]=9000

	-- Dioxyde d'azote (NO2)
	NO2_idx = {}
	NO2_idx[1]=29
	NO2_idx[2]=54
	NO2_idx[3]=84
	NO2_idx[4]=109
	NO2_idx[5]=134
	NO2_idx[6]=164
	NO2_idx[7]=199
	NO2_idx[8]=274
	NO2_idx[9]=399
	NO2_idx[10]=9000

	-- Ozone (0³)
	O3_idx = {}
	O3_idx[1]=24
	O3_idx[2]=54
	O3_idx[3]=79
	O3_idx[4]=104
	O3_idx[5]=129
	O3_idx[6]=149
	O3_idx[7]=179
	O3_idx[8]=209
	O3_idx[9]=239
	O3_idx[10]=9000

	-- Indice Atmo
	Atmo = {}
	Atmo[0]='0 - N/D'
	Atmo[1]='1 - Très bon'
	Atmo[2]='2 - Très bon'
	Atmo[3]='3 - Bon'
	Atmo[4]='4 - Bon'
	Atmo[5]='5 - Moyen'
	Atmo[6]='6 - Médiocre'
	Atmo[7]='7 - Médiocre'
	Atmo[8]='8 - Mauvais'
	Atmo[9]='9 - Mauvais'
	Atmo[10]='10 - Très Mauvais'
	
	local atmo=assert(io.popen(curl..' "https://www.atmo-hdf.fr/acceder-aux-donnees/mesures-des-stations.html"'))
	local InfoAtmo = atmo:read('*all')
	atmo:close()

	i, j = string.find(InfoAtmo, '"NSIT":"'..station..'"')
	
	-- Si la station a bien été trouvée on continue, sinon fin de traitement
	--
	if i ~= 0 then 
		k, l = string.find(InfoAtmo, ',{', j)
		site=string.sub(InfoAtmo, i, k-1)
		
		-- Recherche des mesures de la station en question et réduction à ce périmètre.
		
		i, j = string.find(site, '"MESURE"')
		k, l = string.find(site, '}}')
		mesure = string.sub(site, i, k)
			
		LibelleSite = Unicode(DecodeParm(site, 'ISIT'))
		Longi = DecodeParm(site, 'LONGI')
		Lati = DecodeParm(site, 'LATI')
		
		-- Récupère la liste des poluants mesurés
		-- Toutes les stations ne mesurent pas tous les poluants
		
		nopol = DecodeParm(site, "NOPOL")
		if nopol == nil then voir_les_logs("Aucun poluant n'est mesuré sur cette station - Fin du programme")
		else	
			voir_les_logs("Station : "..LibelleSite)
			voir_les_logs("Longitude : "..Longi)
			voir_les_logs("Latitude : "..Lati)
		--	voir_les_logs(mesure)
			if dz_city_name ~= nil then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_city_name ..'|0|'.. LibelleSite} end

			-- Dioxyde de soufre, SO2
			
			if string.find(nopol, "01") ~= nil then 
				SO2J_DATE, SO2unite, SO2 = DecodePol(mesure, "Dioxyde de soufre")
				voir_les_logs("Dernière mesure : "..SO2J_DATE)
				voir_les_logs("Unité "..SO2unite)
				voir_les_logs("Mesure : "..SO2)
				if dz_so2 ~= nil and CheckLapse(SO2J_DATE, laps) then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_so2 ..'|0|'.. SO2} end
				SO2_indice = AttribueIndice(SO2, SO2_idx)
				voir_les_logs("indice SO2 :"..SO2_indice)
			end

			-- Dioxyde d'azote NO2
			
			if string.find(nopol, "03") ~= nil then 
				NO2J_DATE, NO2unite, NO2 = DecodePol(mesure, "Dioxyde d'azote")
				voir_les_logs("Dernière mesure : "..NO2J_DATE)
				voir_les_logs("Unité "..NO2unite)
				voir_les_logs("Mesure : "..NO2)
				if dz_no2 ~= nil and CheckLapse(NO2J_DATE, laps) then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_no2 ..'|0|'.. NO2} end
				NO2_indice = AttribueIndice(NO2, NO2_idx)
				voir_les_logs("indice NO2="..NO2_indice)
				if SO2_indice < NO2_indice then poldom = "NO2" end
			end

			-- Monoxyde d'azote NO
			
			if string.find(nopol, "02") ~= nil then 
			--	voir_les_logs(mesure)
				NOJ_DATE, NOunite, NO = DecodePol(mesure, "Monoxyde d'azote")
				voir_les_logs("Dernière mesure : "..NOJ_DATE)
				voir_les_logs("Unité "..NOunite)
				voir_les_logs("Mesure : "..NO)
				if dz_no ~= nil and CheckLapse(NOJ_DATE, laps) then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_no ..'|0|'.. NO} end
			end
			
			-- Ozone  O3
			
			if string.find(nopol, "08") ~= nil then 
				O3J_DATE, O3unite, O3 = DecodePol(mesure, "Ozone")
				voir_les_logs("Dernière mesure : "..O3J_DATE)
				voir_les_logs("Unité "..O3unite)
				voir_les_logs("Mesure : "..O3)
				if dz_o3 ~= nil and CheckLapse(O3J_DATE, laps) then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_o3 ..'|0|'.. O3} end
				O3_indice = AttribueIndice(O3, O3_idx)
				voir_les_logs("indice O³="..O3_indice)
				if math.max(SO2_indice, NO2_indice) < O3_indice then poldom = "O³" end
			end

			-- Particules (PM10)
			
			if string.find(nopol, "24") ~= nil then 
				PM10J_DATE, PM10unite, PM10 = DecodePol(mesure, "Particules PM10")
				voir_les_logs("Dernière mesure : "..PM10J_DATE)
				voir_les_logs("Unité "..PM10unite)
				voir_les_logs("Mesure : "..PM10)
				if dz_pm10 ~= nil and CheckLapse(PM10J_DATE, laps) then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_pm10 ..'|0|'.. PM10} end
				PM10_indice = AttribueIndice(PM10, PM10_idx)
				voir_les_logs("indice PM10="..PM10_indice)
				if math.max(SO2_indice, NO2_indice, O3_indice) < PM10_indice then poldom = "PM10" end
			end
			
			-- Particules (PM2.5)
			
			if string.find(nopol, "39") ~= nil then 
				PM25J_DATE, PM25unite, PM25 = DecodePol(mesure, "Particules PM2.5")
				voir_les_logs("Dernière mesure : "..PM25J_DATE)
				voir_les_logs("Unité "..PM25unite)
				voir_les_logs("Mesure : "..PM25)
				if dz_pm25 ~= nil and CheckLapse(PM25J_DATE, laps) then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_pm25 ..'|0|'.. PM25} end
			end
			
			-- L'indice de qualité de l'air prends la valeur de l'indice le plus défavorable.
			
			local air_quality = math.max(NO2_indice, O3_indice, PM10_indice, SO2_indice)
			voir_les_logs("Qualité Air = "..air_quality)
			voir_les_logs("Poluant dominant : "..poldom)


			if dz_air_quality ~= nil then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_air_quality ..'|0|'.. air_quality} end
			if dz_poll_dominant ~= nil then commandArray[#commandArray+1] = {['UpdateDevice'] = dz_poll_dominant ..'|0|'.. poldom} end

			if uservariables['Atmo_indice'] ~= tostring(air_quality) then

			commandArray['Variable:Atmo_indice'] = tostring(air_quality)
				
				if dz_indice_alert ~= nil then   
					if tonumber(air_quality) <= 2   then -- niveau 1 ou 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!<br><br>Indice Atmo : '..Atmo[air_quality]..'<br>Poluant dominant : '..poldom..'<br><br>Indice NO2 : '..Atmo[NO2_indice]..'<br>Indice o3 : '..Atmo[O3_indice]..'<br>Indice SO2 : '..Atmo[SO2_indice]..'<br>Indice PM10 : '..Atmo[PM10_indice]..'#0'}
						end
						voir_les_logs("--- --- --- Pas de pollution --- --- ---",DEBUG)

					elseif tonumber(air_quality) <= 4   then -- niveau 3 ou 4
						commandArray[#commandArray+1] = {['UpdateDevice'] = dz_indice_alert..'|2|Pollution Faible'}
						if send_notification > 0 and send_notification < 3 then
							commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte Pollution#Pollution Faible!<br><br>Indice Atmo : '..Atmo[air_quality]..'<br>Poluant dominant : '..poldom..'<br><br>Indice NO2 : '..Atmo[NO2_indice]..'<br>Indice o3 : '..Atmo[O3_indice]..'<br>Indice SO2 : '..Atmo[SO2_indice]..'<br>Indice PM10 : '..Atmo[PM10_indice]..'#0'}
						end
						voir_les_logs("--- --- --- Pollution Faible --- --- ---",DEBUG)   

					elseif tonumber(air_quality) <= 5   then -- niveau 5
						commandArray[#commandArray+1] = {['UpdateDevice'] = dz_indice_alert..'|3|Pollution Moyenne'}
						if send_notification > 0 and send_notification < 4 then
							commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte Pollution#Pollution Moyenne!<br><br>Indice Atmo : '..Atmo[air_quality]..'<br>Poluant dominant : '..poldom..'<br><br>Indice NO2 : '..Atmo[NO2_indice]..'<br>Indice o3 : '..Atmo[O3_indice]..'<br>Indice SO2 : '..Atmo[SO2_indice]..'<br>Indice PM10 : '..Atmo[PM10_indice]..'#0'}
						end
						voir_les_logs("--- --- --- Pollution Moyenne --- --- ---",DEBUG)     

					elseif tonumber(air_quality) <= 7   then -- niveau 6 ou 7
						commandArray[#commandArray+1] = {['UpdateDevice'] = dz_indice_alert..'|3|Pollution Forte'}
						if send_notification > 0 and send_notification < 5 then
							commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte Pollution#Pollution Forte!<br><br>Indice Atmo : '..Atmo[air_quality]..'<br>Poluant dominant : '..poldom..'<br><br>Indice NO2 : '..Atmo[NO2_indice]..'<br>Indice o3 : '..Atmo[O3_indice]..'<br>Indice SO2 : '..Atmo[SO2_indice]..'<br>Indice PM10 : '..Atmo[PM10_indice]..'#0'}
						end
						voir_les_logs("--- --- --- Pollution Forte --- --- ---",DEBUG)     

					elseif tonumber(air_quality) <= 9   then -- niveau 8 ou 9
						commandArray[#commandArray+1] = {['UpdateDevice'] = dz_indice_alert..'|3|Pollution très Forte'}
						if send_notification > 0 and send_notification < 6 then
							commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte Pollution#Pollution très Forte!<br><br>Indice Atmo : '..Atmo[air_quality]..'<br>Poluant dominant : '..poldom..'<br><br>Indice NO2 : '..Atmo[NO2_indice]..'<br>Indice o3 : '..Atmo[O3_indice]..'<br>Indice SO2 : '..Atmo[SO2_indice]..'<br>Indice PM10 : '..Atmo[PM10_indice]..'#0'}
						end
						voir_les_logs("--- --- --- Pollution très Forte --- --- ---",DEBUG)     

					elseif tonumber(air_quality) > 9  then -- niveau 10
						commandArray[#commandArray+1] = {['UpdateDevice'] = dz_indice_alert..'|4|Pollution extrèmement forte'}
						if send_notification > 0 and send_notification < 7 then
							commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte Pollution#Pollution extrèmement forte!<br><br>Indice Atmo : '..Atmo[air_quality]..'<br>Poluant dominant : '..poldom..'<br><br>Indice NO2 : '..Atmo[NO2_indice]..'<br>Indice o3 : '..Atmo[O3_indice]..'<br>Indice SO2 : '..Atmo[SO2_indice]..'<br>Indice PM10 : '..Atmo[PM10_indice]..'#0'}
						end
						voir_les_logs("--- --- --- Pollution extrèmement forte --- --- ---",DEBUG)
					else
						voir_les_logs("niveau non defini")
					end
				end
			end   
		end
	end
end
Cdt
Bertrand
2020.2 (build 12106) PC Windows10 (Elite book); DANFOSS LC13, Topp; Senseurs univ FIBARO FGBS001, Flood Sensor, ZMNHBD1 Flush 2 Relays ; FIBARO FGS222-FGS212;RFXCOM-RFXtrx433 USB 433.92MHz , Prises Phénix, Prises et Eclairage DI-O, SOMFY RTS,Sonoff ..

rito
Messages : 9
Enregistré le : 21 oct. 2019, 18:30

Re: LUA : Qualité de l'air dans les Hauts de France

Message par rito »

merci pour cette reponse.... qui ne résout pas le problème

pour info je suis sous raspberry pi
j ai mis la station de ST omer

mon dispositif de test ; ( créé avec DUMMY custom sensor)
idx: 145 Matériel: ATMO ID:00082145 nom : pm10 Type: General Sous-type:Custom Sensor
Donnée: 0 µg/m³

j ai du commenter la permiere ligne --#!/usr/bin/lua car ca me mettait une erreur


la je seche !

Chrominator
Messages : 583
Enregistré le : 19 déc. 2015, 07:29
Localisation : France

Re: LUA : Qualité de l'air dans les Hauts de France

Message par Chrominator »

La première ligne est le shebang qui identifie explicitement le binaire de l’interpréteur du script, LUA dans notre cas.
Pas grave de le mettre en commentaire avec Domoticz qui s'en sortira quand même.

Bien sûr ce script est de type time, donc il faut le nommer script_time_q_air.lua par exemple et le placer dans le répertoire ~/domoticz/scripts/lua.

A propos de ton erreur, il me faudrait plus d'éléments car même en testant mon script avec la station 1539 d'Amiens 14 juillet je n'ai aucune erreur.
Au passage, cette station ne mesure que les particules les plus fines PM 2.5, il y en a une autre nommée Amiens St Pierre qui mesure beaucoup plus de polluants (ID 1535).

Je viens de remarquer que certaines stations n'existent plus par rapport à la liste d'origine.
Vérifie que celle que tu as choisi n'est pas en rouge ci-dessous :
Stations.png
Stations.png (24.23 Kio) Vu 1069 fois

La liste actuelle est la suivante :

1134 Saint-Amand-les-Eaux
1079 Noeux-les-Mines
1114 Wattignies
1115 Lens Varsovie
1137 Boulogne-sur-Mer
1138 Lille Leeds
1539 Amiens 14 Juillet.
1541 Saint-Quentin Victor Hugo
1139 Isbergues
1142 Saint-Pol-sur-Mer
1523 Arrest
1534 Beauvais Aéroport
1527 Creil
1509 Nogent sur Oise
1530 Rieux
1526 Saint-Quentin Stade
1529 Roye
1519 Salouël
1125 Saint-Laurent-Blangy
1110 Béthune Stade
1049 Outreau
1047 Sangatte
1120 Calais Berthelot
1126 Calais Parmentier
1030 Malo-les -Bains
1038 Mardyck
1118 Gravelines PC/Drire
1127 Cappelle-la-Grande
1129 Grande-Synthe
1003 Douai Theuriet
1093 Harnes
1007 Maubeuge
1065 Lille Fives
1073 Roubaix Serres
1059 Marcq-en-Baroeul
1066 Halluin
1132 Campagne-lès-Boulonnais
1133 Cartignies
1051 Saint-Omer
1001 Valenciennes Acacias
1006 Valenciennes Wallon
1011 Denain
1535 Amiens Saint-Pierre
1542 Beauvais Dr. Lamotte

Si malgré le choix d'une station de cette liste, tu as toujours l'erreur, pourrais-tu ajouter dans le script la ligne suivante, sous la ligne où tu as indiqué le n° de la station :

Code : Tout sélectionner

DEBUG = true
Ça devrait permettre d'obtenir quelque chose comme ce qui suit dans les log, que tu pourras poster ici pour que j'essaie d'identifier l'erreur.

Code : Tout sélectionner

 2020-01-04 09:05:02.316 var stations = [{"IDENTIFIANT":"SM_VAC","NSIT":"1134","NDEPART":"59","NINSEE":"59526","ISIT":"Saint-Amand-les-Eaux","NOM_COURT_SIT":":00000","AXE":"Centre technique municipal - ruelle des \u00e9coles","CODE_POSTAL":"59230","NO_TELEPHONE":"0629236301","NO_ZONE":null,"NO_RTC":"3","ADRESSE_IP":"185.209.141.140:80","MPST":"SUPERU","MPST1_U":null,"MPST2_U":null,"MPST3_U":null,"MPST4_U":null,"MPST5_U":null,"MPST_SU_LOCAL":null,"MPST_NOUVEAU":"SUPERU","LONGI":"3.427944608825841400","LATI":"50.456472222221780000","ALTI":"22","LAMBERTX":"677660","LAMBERTY":"2607386","NOM_GESTION":"Artois-Gohelle-Hainaut","D
2020-01-04 09:05:02.317 Status: LUA: k=23320
2020-01-04 09:05:02.317 Status: LUA: l=23321
2020-01-04 09:05:02.317 Status: LUA: Station : AMIENS Trafic
2020-01-04 09:05:02.317 Status: LUA: Longitude : 2.282472222221680400
2020-01-04 09:05:02.317 Status: LUA: Latitude : 49.877152777777326000
2020-01-04 09:05:02.317 Status: LUA: Dernière mesure : 2020-01-04 08:00
2020-01-04 09:05:02.317 Status: LUA: Unité microg\/m3
2020-01-04 09:05:02.318 Status: LUA: Mesure : 1.00
2020-01-04 09:05:02.318 Status: LUA: Sat Jan 4 08:00:00 2020
2020-01-04 09:05:02.318 Status: LUA: Dernière mesure il y a 3902 secondes (01 heures 05 minutes).
2020-01-04 09:05:02.318 Status: LUA: Qualité Air = 0
2020-01-04 09:05:02.318 Status: LUA: Poluant dominant : SO2
Partir, c’est pourrir un pneu.

Ubuntu 20.04 LTS - Domoticz v2020.2
rfxcom RFXtrx433 USB Version: Ext2/1025
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway with LAN interface 48.4

rito
Messages : 9
Enregistré le : 21 oct. 2019, 18:30

Re: LUA : Qualité de l'air dans les Hauts de France

Message par rito »

Malheureusement j avais déjà mis débug=true mais rien ne remonte !
J avais mis la station de st omer étant sur qu elle fonctionne .

J ai crée la variable dans domoticz en l’an mettant en entier mais j ai essayé en chaîne et c est pareil !

Chrominator
Messages : 583
Enregistré le : 19 déc. 2015, 07:29
Localisation : France

Re: LUA : Qualité de l'air dans les Hauts de France

Message par Chrominator »

rito a écrit :
04 janv. 2020, 10:28
Malheureusement j avais déjà mis débug=true mais rien ne remonte !
Désolé, juste pour être sûr :
Si tu mets débug=true quand j'écris de mettre DEBUG = true, c'est normal qu'on ne se comprenne pas.

Il faudrait enlever les signes - qui sont devant l'appel de la fonction voir_les_logs et ajouter la fonction suivante dans le script :

Code : Tout sélectionner

function voir_les_logs (s) -- nécessite la variable DEBUG
    if DEBUG then
      if s ~= nil then
		print (s)
      else
 		print ("aucune valeur affichable")
      end
    end
end
Partir, c’est pourrir un pneu.

Ubuntu 20.04 LTS - Domoticz v2020.2
rfxcom RFXtrx433 USB Version: Ext2/1025
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway with LAN interface 48.4

rito
Messages : 9
Enregistré le : 21 oct. 2019, 18:30

Re: LUA : Qualité de l'air dans les Hauts de France

Message par rito »

Mes excuses pour cette faute , j avais bien mis les espaces sans majuscule pour true ( vive la correction automatique) mais DEBUG en maj

J essaie la nouvelle fonction de debug ce soir

Encore merci pour la précieuse aide !

rito
Messages : 9
Enregistré le : 21 oct. 2019, 18:30

Re: LUA : Qualité de l'air dans les Hauts de France

Message par rito »

je ne comprend pas, meme en mettant

Code : Tout sélectionner

DEBUG = true

function voir_les_logs (s) -- nécessite la variable DEBUG
    if DEBUG then
      if s ~= nil then
        print ("<font color='#f3031d'>".. s .."</font>")
      else
        print ("<font color='#f3031d'>aucune valeur affichable</font>")
      end
    end
end


function voir_les_logs (s) -- nécessite la variable DEBUG
    if DEBUG then
      if s ~= nil then
		print (s)
      else
 		print ("aucune valeur affichable")
      end
    end
end
je n ai aune remontee d erreur mais toujours ce :

Code : Tout sélectionner

2020-01-05 01:25:00.203 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_q_air.lua: /home/pi/domoticz/scripts/lua/script_time_q_air.lua:304: attempt to perform arithmetic on global 'k' (a nil value)
j ai essayé avec plsuieurs stations
je ne comprend pas !

Répondre