Il permet d'afficher sur votre Domoticz les différents niveaux de polluants dans votre ville ainsi que les indices et alertes crit'air sachant que dans certaines villes les niveaux de pollution conditionneront l'autorisation ou non de rouler pour certains véhicules.
Je n'ai pas beaucoup de recul pour le moment sur le fonctionnement mais çà tourne depuis le 17/11/18 chez moi sans incident.
J'utilise crontab pour lancer le script toutes les 30min.
Nom du script:
air-strasbourg.py
D'abord, vous devez définir les différentes adresses correspondantes à votre ville:
-http://www.atmo-grandest.eu/lair-dans-ma-ville
-https://air.plumelabs.com/fr/
-https://www.crit-air.fr/fr/informations ... rance.html
Exemple pour Strasbourg:
URL_ATMO = "https://services.atmo-grandest.eu/widge ... mune/67482"
URL_PLUMELABS = "https://air.plumelabs.com/fr/live/strasbourg"
URL_CRITAIR = "https://www.crit-air.fr/fr/informations ... e-zpa.html"
Capteurs à créer:
-1 custom sensor par polluant (ozone, particules fines, dioxyde d'azote, dioxyde de soufre, monoxyde de carbone), unité ug/m3
-1 text sensor pour le niveau de pollution
-1 text sensor pour le status crit'air
-1 capteur d'alerte pour l'indice de pollution de l'air
Dans le script, remplacer:
-"192.168.31.103:8989" par l'adresse et le port de votre Domoticz
-Tous les Idx par ceux de vos capteurs
Prérequis Python:
-Avoir Python d'installé sur le Pi
-Avoir installé les modules datetime, os, csv, requests et bs4
Crontab:
-Se connecter au Pi avec votre console habituelle (Putty par exemple)
-Faire un crontab -e pour éditer votre fichier Crontab
-Ajouter la ligne à la fin du fichier */30 * * * * /usr/bin/python /home/pi/domoticz/scripts/python/air-strasbourg.py >/dev/null 2>&1
->Ceci lancera le script toutes les 30min


Code : Tout sélectionner
#!/usr/bin/env python
# coding: utf-8
#Author: Digdogger
#https://easydomoticz.com/forum/viewtopic.php?f=17&t=7510
import os
import csv
import requests
from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
from datetime import datetime
#URLs
URL_ATMO = "https://services.atmo-grandest.eu/widget/small/commune/67482" #Récuperer l'adresse de votre commune ici http://www.atmo-grandest.eu/lair-dans-ma-ville
URL_PLUMELABS = "https://air.plumelabs.com/fr/live/strasbourg" #Récupérer l'adresse correspondant à votre ville https://air.plumelabs.com/fr/
URL_CRITAIR = "https://www.crit-air.fr/fr/informations-sur-la-vignette-critair/zones-environnementales-en-france/strasbourg-zone-zpa.html" #Recupérer ici la zone correspondante à l'alerte crit'air: https://www.crit-air.fr/fr/informations-sur-la-vignette-critair/zones-environnementales-en-france.html
#Capteurs à créer:
#1 custom sensor par polluant (ozone, particules fines, dioxyde d'azote, dioxyde de soufre, monoxyde de carbone), unité ug/m3
#1 text pour le niveau de pollution
#1 capteur d'alerte pour l'indice de pollution de l'air
#1 text pour le status crit'air
requete = requests.get(URL_ATMO)
page = requete.content
soup = BeautifulSoup(page,"html.parser")
iqa = soup.find(id="iqa-bubble")
if iqa is not None:
lien= iqa['src']
index_start = int(lien.find('img/'))+4
index_end = int(lien.find('_small.svg'))
indice_air=lien[index_start:index_end]
if 0<int(indice_air)<3:
indice_level='0'
elif 2<int(indice_air)<5:
indice_level='1'
elif int(indice_air)==5:
indice_level='2'
elif 5<int(indice_air)<8:
indice_level='3'
elif 7<int(indice_air)<11:
indice_level='4'
url_aq='curl "http://192.168.31.103:8989/json.htm?type=command¶m=udevice&idx=361&nvalue='+indice_level+'&svalue='+indice_air+'"'
os.system(url_aq) #update Indice de l'air
dico={}
requete = requests.get(URL_PLUMELABS)
page = requete.content
soup = BeautifulSoup(page,"html.parser")
nom_polluant = soup.find_all('li', class_='pollutant-name')
valeur = soup.find_all('li', class_='pollutant-current-value')
for i in range (len(nom_polluant)):
dico[nom_polluant[i].text.strip()]=valeur[i].text.strip()
if dico.get('particules fines') is not None:
particules_fines=dico.get('particules fines')
url_pf='curl "http://192.168.31.103:8989/json.htm?type=command¶m=udevice&idx=357&nvalue=0&svalue='+particules_fines+'"'
os.system(url_pf) #update particules fines
else:
os.system('curl "http://192.168.31.103:8989/json.htm?type=command¶m=udevice&idx=357&nvalue=0&svalue=0"')
if dico.get('dioxyde d\'azote') is not None:
dioxyde_dazote=dico.get('dioxyde d\'azote')
url_dda='curl "http://192.168.31.103:8989/json.htm?type=command¶m=udevice&idx=358&nvalue=0&svalue='+dioxyde_dazote+'"'
os.system(url_dda) #update dioxyde d'azote
else:
os.system('curl "http://192.168.31.103:8989/json.htm?type=command¶m=udevice&idx=358&nvalue=0&svalue=0"')
if dico.get('ozone') is not None:
ozone=dico.get('ozone')
url_oz='curl "http://192.168.31.103:8989/json.htm?type=command¶m=udevice&idx=356&nvalue=0&svalue='+ozone+'"'
os.system(url_oz) #update ozone
else:
os.system('curl "http://192.168.31.103:8989/json.htm?type=command¶m=udevice&idx=356&nvalue=0&svalue=0"')
if dico.get('dioxyde de soufre') is not None:
dioxyde_de_soufre=dico.get('dioxyde de soufre')
url_dds='curl "http://192.168.31.103:8989/json.htm?type=command¶m=udevice&idx=369&nvalue=0&svalue='+dioxyde_de_soufre+'"'
os.system(url_dds) #update dioxyde de soufre
else:
os.system('curl "http://192.168.31.103:8989/json.htm?type=command¶m=udevice&idx=369&nvalue=0&svalue=0"')
if dico.get('monoxyde de carbone') is not None:
monoxyde_de_carbone=dico.get('monoxyde de carbone')
url_mdc='curl "http://192.168.31.103:8989/json.htm?type=command¶m=udevice&idx=370&nvalue=0&svalue='+monoxyde_de_carbone+'"'
os.system(url_mdc) #update monoxyde_de_carbone
else:
os.system('curl "http://192.168.31.103:8989/json.htm?type=command¶m=udevice&idx=370&nvalue=0&svalue=0"')
niveau= soup.find(id="pollution-level")
if niveau is not None:
niveau=UnicodeDammit(niveau.text)
niveau=niveau.unicode_markup
base_url_ndp = 'http://192.168.31.103:8989/json.htm?type=command¶m=udevice&idx=359&nvalue=0&svalue='
url_ndp = ''.join([base_url_ndp, niveau])
url_ndp_fin = requests.get(url_ndp) #update niveau de pollution
requete = requests.get(URL_CRITAIR)
page = requete.content
soup = BeautifulSoup(page,"html.parser")
message = soup.find_all("p", class_="vorwarnung")
if message is not None:
message = message[0].text
base_url_critair = 'http://192.168.31.103:8989/json.htm?type=command¶m=udevice&idx=362&nvalue=0&svalue='
url_critair = ''.join([base_url_critair, message])
url_critair_fin = requests.get(url_critair) #update status crit'air
