Script Python: Alerte crit'air, polluants de l'air et indice de pollution dans votre ville

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]
digdogger
Messages : 213
Enregistré le : 16 juil. 2017, 09:21

Script Python: Alerte crit'air, polluants de l'air et indice de pollution dans votre ville

Message par digdogger »

Salut, pour mon premier script sur le forum, je vous propose celui-ci.
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


Image

Image


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&param=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&param=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&param=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&param=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&param=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&param=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&param=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&param=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&param=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&param=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&param=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&param=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&param=udevice&idx=362&nvalue=0&svalue='  
    url_critair = ''.join([base_url_critair, message])
    url_critair_fin = requests.get(url_critair) #update status crit'air
Modifié en dernier par digdogger le 19 déc. 2018, 22:32, modifié 6 fois.
Raspberry Pi 3 + Raspbian Jessie Lite + Domoticz V4.9700 - RFlink USB V48 433.42MHz - Volets Somfy RTS - MySensors USB V2.1.1 - IDE Arduino 1.8.8

RaspOlivier
Messages : 91
Enregistré le : 10 déc. 2016, 09:40

Re: Script Python: Alerte crit'air, polluants de l'air et indice de pollution dans votre ville

Message par RaspOlivier »

Salut,

J'ai fait un copié/collé de ce script en le personnalisant avec :

- L'adresse IP de mon Pi
- Son port
- Les Idx correspondants aux capteurs virtuels créés

Bien évidemment, il ne se passe rien.

Qu'y a t-il à faire d'autre ?

Merci

Edit :
Extrait du log :

2018-12-15 13:09:35.840 Error: EventSystem: Failed to execute python event script "critair"
2018-12-15 13:09:35.840 Error: EventSystem: Traceback (most recent call last):
2018-12-15 13:09:35.840 Error: EventSystem: File "<string>", line 9, in <module>
2018-12-15 13:09:35.840 Error: EventSystem: ImportError: No module named 'requests'
La curiosité est un joli défaut ...

Quand ça ne fonctionne plus, il faut trouver pourquoi et réparer.C'est seulement après que l'on peut jeter l'appareil l'esprit tranquille ...

digdogger
Messages : 213
Enregistré le : 16 juil. 2017, 09:21

Re: Script Python: Alerte crit'air, polluants de l'air et indice de pollution dans votre ville

Message par digdogger »

Salut, tu le lances comment le script? En manuel, il fonctionne?
Dans le log, il semble que tu n'aies pas installé les modules python requis.
Chez moi, il se lance avec crontab. Il faut modifier ton fichier crontab pour le lancer toutes les 30 minutes mais d'abord, il faut réussir à le lancer en manuel et voir si tes capteurs se mettent à jour dans Domoicz.
Raspberry Pi 3 + Raspbian Jessie Lite + Domoticz V4.9700 - RFlink USB V48 433.42MHz - Volets Somfy RTS - MySensors USB V2.1.1 - IDE Arduino 1.8.8

RaspOlivier
Messages : 91
Enregistré le : 10 déc. 2016, 09:40

Re: Script Python: Alerte crit'air, polluants de l'air et indice de pollution dans votre ville

Message par RaspOlivier »

Salut digdogger,

Je précise que je débute (depuis 2 ou 3 ans mais je lache entre temps).

J'ai désactivé pour le moment le script que j'avais copié/collé/adapté dans les évènements domoticz et qui ne fonctionne pas pour moi.

J'ai refait le même script et je l'ai enregistré dans /home/pi/domoticz/script/python
J'ai donc : /home/pi/domoticz/script/python/critair.py

le shebang de mon script adapté est #!/usr/bin/python
(j'ai fait ça car je n'ai pas de répertoire env dans /usr/bin, peut-être est-ce une première conn...)

J'ai python 2.7.13 et 3.5.3 d'installé sur mon pi

Si depuis home/pi/domoticz/script/python je tapes :

$ python3.5 critair.py

j'ai :

Traceback (most recent call last):
File "critair.py", line 10, in <module>
from bs4 import BeautifulSoup
ImportError: No module named 'bs4'

{EDIT 19h26 : je suppose que python3.5 ne connait pas le chemin pour aller chercher la librairie bs4 FIN EDIT}
{EDIT 20:04 : merci papoo, librairie installée pour python 3.5 FIN EDIT}

par contre, si je lance

$ python critair.py
le script fonctionne et l'ensemble des capteurs virtuels se mettent à jour (du moins la date de MAJ car j'ai 0 ppm).

je vais refaire quelques recherches
Modifié en dernier par RaspOlivier le 19 déc. 2018, 20:05, modifié 2 fois.
La curiosité est un joli défaut ...

Quand ça ne fonctionne plus, il faut trouver pourquoi et réparer.C'est seulement après que l'on peut jeter l'appareil l'esprit tranquille ...

digdogger
Messages : 213
Enregistré le : 16 juil. 2017, 09:21

Re: Script Python: Alerte crit'air, polluants de l'air et indice de pollution dans votre ville

Message par digdogger »

Salut,
c'est bon signe, tiens nous au courant.
Raspberry Pi 3 + Raspbian Jessie Lite + Domoticz V4.9700 - RFlink USB V48 433.42MHz - Volets Somfy RTS - MySensors USB V2.1.1 - IDE Arduino 1.8.8

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

Re: Script Python: Alerte crit'air, polluants de l'air et indice de pollution dans votre ville

Message par papoo »

Pour que cela marche avec python 3
Pip3 install bs4
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

RaspOlivier
Messages : 91
Enregistré le : 10 déc. 2016, 09:40

Re: Script Python: Alerte crit'air, polluants de l'air et indice de pollution dans votre ville

Message par RaspOlivier »

Merci papoo,

Du coup j'ai bien bs4 d'installé et reconnu avec un help() modules dans python3.5.
même si mon script ne se lance pas plus (1,5 page d'erreurs lol)
j'y retourne !
La curiosité est un joli défaut ...

Quand ça ne fonctionne plus, il faut trouver pourquoi et réparer.C'est seulement après que l'on peut jeter l'appareil l'esprit tranquille ...

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

Re: Script Python: Alerte crit'air, polluants de l'air et indice de pollution dans votre ville

Message par papoo »

Installes les autres modules via pip3 peut etre?
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

RaspOlivier
Messages : 91
Enregistré le : 10 déc. 2016, 09:40

Re: Script Python: Alerte crit'air, polluants de l'air et indice de pollution dans votre ville

Message par RaspOlivier »

j'ai fait pip3 install pour requests et datetime et les librairies se sont installées.
Par contre, pour os et csv, j'ai la réponse suivante :
Collecting os
Could not find a version that satisfies the requirement os (from versions: )
No matching distribution found for os

Malgré cela, la commande : python3.5 critair.py me lance le script sans erreurs
(j'ai tjrs 0 ppm donc il y a quelquechose qui remonte mal, je vais essayer avec une autre ville)
{EDIT 21h12: Idem avec une autre ville (STRASBOURG), aucune valeur en ppm FIN EDIT}

Merci pour votre aide
La curiosité est un joli défaut ...

Quand ça ne fonctionne plus, il faut trouver pourquoi et réparer.C'est seulement après que l'on peut jeter l'appareil l'esprit tranquille ...

digdogger
Messages : 213
Enregistré le : 16 juil. 2017, 09:21

Re: Script Python: Alerte crit'air, polluants de l'air et indice de pollution dans votre ville

Message par digdogger »

çà donne çà à cette heure chez moi:
Image
Raspberry Pi 3 + Raspbian Jessie Lite + Domoticz V4.9700 - RFlink USB V48 433.42MHz - Volets Somfy RTS - MySensors USB V2.1.1 - IDE Arduino 1.8.8

Répondre