Meteo.gp : script python pour connaître le niveau de vigilance météo aux Antilles et en Guyane
Par oliman le jeudi 18 août 2011, 18:13 - Dev - Lien permanent
Nous sommes actuellement en pleine saision cyclonique et collectionnons les périodes de vigilance jaune ou orange. Les avis de vigilance météo sont diffusés par le service régionale de météo France, en l'occurence meteo.gp.
Concrètement, meteo.gp publie une carte du niveau de vigilance et un flux RSS permettant de connaître le niveau de vigilance pour la Guadeloupe, les Îles du Nord, la Martinique et la Guyane.
Pour connaître facilement le niveau de vigilance en cours, j'ai donc écrit un petit script python qui permet d'obtenir le niveau de vigilance en cours pour une zone particulière ainsi que la date et l'heure de publication du dernier avis.
Updated : [19 août 2011] une nouvelle version de ce script avec un code plus pythonique (testé avec pylint) est dispo.
vigimeteo.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# vigilance.py
#
# Copyright 2011 olivier watte avaland.org
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
import feedparser
import sys
#~ import logging
#~
#~ logging.basicConfig(level=logging.INFO,
#~ format='%(asctime)s %(levelname)s %(message)s')
def main():
URL_FEED_VIGILANCE = "http://www.meteo.gp/rss/rss_vigi.xml"
USAGE = '\n'.join(['retrieves weather alert level for French West Indies and French Guyane from meteo.gp website',
'usage : %prog <area_alias>',
'where area_alias in :',
'****************************************',
'* area * aliases *',
'****************************************',
'* Iles du Nord * idn, ilesdunord, nord *',
'* Guadeloupe * gp, guadeloupe, 971 *',
'* Martinique * mq, martinique, 972 *',
'* Guyane * gf, guyane, 974 *',
'****************************************',
'',
'example for the Guadeloupe:',
'vigilance.py 971',
'vigilance.py gp']
)
COUNTRY_ALIASES = [
['IlesduNord', ['idn', 'ilesdunord', 'nord']],
['Guadeloupe', ['gp', 'guadeloupe', '971']],
['Martinique',['mq', 'martinique', '972' ]],
['Guyane', ['gf', 'guyane', '974']]
]
if len(sys.argv)==1 or sys.argv[1] in ['-h', '--help']:
print USAGE
else:
url_feed_vigilance = URL_FEED_VIGILANCE
wanted = sys.argv[1].lower()
vigilance = get_vigilance_levels(url_feed_vigilance)
area = [ alias[0] for alias in COUNTRY_ALIASES if wanted in alias[1] ]
if len(area) > 0 and vigilance.has_key(area[0]):
result = ''.join([
vigilance[area[0]],
' (',
vigilance['updated'],
')'
])
else :
result = ''.join([
'ERREUR : no data for ',
sys.argv[1],
'\n',
USAGE
])
print result
def get_vigilance_levels(url_feed_vigilance):
'''extracts weather vigilance level from the RSS.
@url_feed_vigilance : RSS feed to parse
The levels are stored in the first item's description :
<item>
<description>
Iles du Nord : vert.
           Guadeloupe : vert.
           Martinique : vert.
           Guyane : vert.
</description>
</item>
The datetime is the item <pubDate> like : <pubDate>Thu, 18 Aug 2011 10:40:00 GMT</pubDate>
'''
d = feedparser.parse(url_feed_vigilance)
vigilance = d['entries'][0].summary
bruit = [u'\xa0', u'\n', ' ']
for b in bruit :
vigilance = vigilance.replace(b, '')
vigilances = vigilance.split('.')
vigilance = {}
# alert level
for dataz in vigilances:
if (":" in dataz):
data = dataz.split(":")
area = data[0]
level = data[1]
vigilance[area] = level
# feed date
vigilance['updated'] = d['entries'][0].updated
return vigilance
if __name__ == '__main__':
main()
Remarque:
mon N900 utilise python 2.5.4, ma station utilise python 2.6.6 et la version la plus répandue (genre Ubuntu) est la 2.7.1+...
Hors la méthode pour parser les arguments de la ligne de commande évolue entre ces différentes versions, notamment par le remplacement dans la 2.7 de optparse (deprecated) par argparse
Donc, plutôt que d'écrire des if selon la version, comme ce script n'a besoin que d'un argument pour s'exécuter :
- -h ou --help pour savoir comment l'utiliser
- l'alias de la zone dont on veut connaître le niveau de vigilance
j'ai fait un petit système très simple en utilisant sys.argv[1] et un tuple de tuple d'alias.


