@ -1,116 +1,4 @@ | |||
# ---> Python | |||
# Byte-compiled / optimized / DLL files | |||
/config.json | |||
/.project | |||
/.pydevproject | |||
__pycache__/ | |||
*.py[cod] | |||
*$py.class | |||
# C extensions | |||
*.so | |||
# Distribution / packaging | |||
.Python | |||
build/ | |||
develop-eggs/ | |||
dist/ | |||
downloads/ | |||
eggs/ | |||
.eggs/ | |||
lib/ | |||
lib64/ | |||
parts/ | |||
sdist/ | |||
var/ | |||
wheels/ | |||
*.egg-info/ | |||
.installed.cfg | |||
*.egg | |||
MANIFEST | |||
# PyInstaller | |||
# Usually these files are written by a python script from a template | |||
# before PyInstaller builds the exe, so as to inject date/other infos into it. | |||
*.manifest | |||
*.spec | |||
# Installer logs | |||
pip-log.txt | |||
pip-delete-this-directory.txt | |||
# Unit test / coverage reports | |||
htmlcov/ | |||
.tox/ | |||
.nox/ | |||
.coverage | |||
.coverage.* | |||
.cache | |||
nosetests.xml | |||
coverage.xml | |||
*.cover | |||
.hypothesis/ | |||
.pytest_cache/ | |||
# Translations | |||
*.mo | |||
*.pot | |||
# Django stuff: | |||
*.log | |||
local_settings.py | |||
db.sqlite3 | |||
# Flask stuff: | |||
instance/ | |||
.webassets-cache | |||
# Scrapy stuff: | |||
.scrapy | |||
# Sphinx documentation | |||
docs/_build/ | |||
# PyBuilder | |||
target/ | |||
# Jupyter Notebook | |||
.ipynb_checkpoints | |||
# IPython | |||
profile_default/ | |||
ipython_config.py | |||
# pyenv | |||
.python-version | |||
# celery beat schedule file | |||
celerybeat-schedule | |||
# SageMath parsed files | |||
*.sage.py | |||
# Environments | |||
.env | |||
.venv | |||
env/ | |||
venv/ | |||
ENV/ | |||
env.bak/ | |||
venv.bak/ | |||
# Spyder project settings | |||
.spyderproject | |||
.spyproject | |||
# Rope project settings | |||
.ropeproject | |||
# mkdocs documentation | |||
/site | |||
# mypy | |||
.mypy_cache/ | |||
.dmypy.json | |||
dmypy.json | |||
# Pyre type checker | |||
.pyre/ | |||
@ -0,0 +1,12 @@ | |||
[[source]] | |||
url = "https://pypi.python.org/simple" | |||
verify_ssl = true | |||
name = "pypi" | |||
[packages] | |||
pyowm = "*" | |||
[dev-packages] | |||
[requires] | |||
python_version = "3.7" |
@ -0,0 +1,75 @@ | |||
{ | |||
"_meta": { | |||
"hash": { | |||
"sha256": "90ab82af397550e8743df5673adc3a1ad7f261129395971bee308376aaff8fd9" | |||
}, | |||
"pipfile-spec": 6, | |||
"requires": { | |||
"python_version": "3.7" | |||
}, | |||
"sources": [ | |||
{ | |||
"name": "pypi", | |||
"url": "https://pypi.python.org/simple", | |||
"verify_ssl": true | |||
} | |||
] | |||
}, | |||
"default": { | |||
"certifi": { | |||
"hashes": [ | |||
"sha256:046832c04d4e752f37383b628bc601a7ea7211496b4638f6514d0e5b9acc4939", | |||
"sha256:945e3ba63a0b9f577b1395204e13c3a231f9bc0223888be653286534e5873695" | |||
], | |||
"version": "==2019.6.16" | |||
}, | |||
"chardet": { | |||
"hashes": [ | |||
"sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", | |||
"sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" | |||
], | |||
"version": "==3.0.4" | |||
}, | |||
"geojson": { | |||
"hashes": [ | |||
"sha256:6e4bb7ace4226a45d9c8c8b1348b3fc43540658359f93c3f7e03efa9f15f658a", | |||
"sha256:ccbd13368dd728f4e4f13ffe6aaf725b6e802c692ba0dde628be475040c534ba" | |||
], | |||
"version": "==2.5.0" | |||
}, | |||
"idna": { | |||
"hashes": [ | |||
"sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", | |||
"sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" | |||
], | |||
"version": "==2.8" | |||
}, | |||
"pyowm": { | |||
"hashes": [ | |||
"sha256:1c51334a9bcd697993d4c68e5437d5f420d33dd7f5d872b2ad93c3c47b7a9649", | |||
"sha256:2ac88777565518b9e9aa3fc172c543ada4cbfc667d83775cd17c0e52ea6ccc86", | |||
"sha256:43d49901493a883335855d8dbd16f8aa0d2e26e0183b6b6fe8a5471904c0e37a", | |||
"sha256:805bd2f42e15770c0d2822b77add7770685cb94cfbeae8633328d0d522332fd7", | |||
"sha256:8fd41a18536f4d6c432bc6d9ea69994efb1ea9b43688cf19523659b6f4d86cf7", | |||
"sha256:b3294065a08417b4b0367fc424a77a0caafa24df8fd842ba9b08f1b5542c092e" | |||
], | |||
"index": "pypi", | |||
"version": "==2.10.0" | |||
}, | |||
"requests": { | |||
"hashes": [ | |||
"sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", | |||
"sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" | |||
], | |||
"version": "==2.22.0" | |||
}, | |||
"urllib3": { | |||
"hashes": [ | |||
"sha256:b246607a25ac80bedac05c6f282e3cdaf3afb65420fd024ac94435cabe6e18d1", | |||
"sha256:dbe59173209418ae49d485b87d1681aefa36252ee85884c31346debd19463232" | |||
], | |||
"version": "==1.25.3" | |||
} | |||
}, | |||
"develop": {} | |||
} |
@ -1,3 +1,5 @@ | |||
# weather_to_freemobile | |||
# weather\_to\_freemobile | |||
A simple script that sends OpenWeatherMap forecasts to a FreeMobile phone | |||
A simple script that sends [OpenWeatherMap](https://openweathermap.org/) forecasts to a [FreeMobile](http://mobile.free.fr/) phone. | |||
To run the script you need to fill in `config.sample.json` and to rename it to `config.json`. |
@ -0,0 +1,7 @@ | |||
{ | |||
"freemobile_user":"", | |||
"freemobile_apikey":"", | |||
"openweathermap_city":"Paris,FR", | |||
"openweathermap_apikey":"", | |||
"openweathermap_language":"fr" | |||
} |
@ -0,0 +1,64 @@ | |||
#!/usr/bin/python3 | |||
""" | |||
A simple script that sends the daily weather to a FreeMobile phone | |||
""" | |||
import json | |||
import logging | |||
import pyowm | |||
import requests | |||
class WeatherToFreemobile(): | |||
def __init__(self, config_file='config.json'): | |||
logging.info('Load configuration from config.json file') | |||
with open('config.json') as config_file: | |||
self.config = json.load(config_file) | |||
def send_sms_to_freemobile(self, message): | |||
""" | |||
Sends a SMS using the FreeMobile API | |||
https://mobile.free.fr/moncompte/index.php?page=options | |||
""" | |||
data = { | |||
'user':self.config['freemobile_user'], | |||
'pass':self.config['freemobile_apikey'], | |||
'msg':bytes(message,'utf-8').decode('iso-8859-1') | |||
} | |||
logging.debug(data) | |||
logging.info('Contacting FreeMobile API') | |||
r = requests.post('https://smsapi.free-mobile.fr/sendmsg', json = data) | |||
if r.status_code == 200: | |||
logging.info('SMS sent') | |||
else: | |||
logging.warning('SMS *not* sent. Status code %s', r.status_code) | |||
def get_weather(self): | |||
""" | |||
Gets the current weather from OpenWeatherMap | |||
""" | |||
city = self.config['openweathermap_city'] | |||
apikey = self.config['openweathermap_apikey'] | |||
apilanguage = self.config['openweathermap_apikey'] | |||
logging.info('Opening OpenWeatherMap API') | |||
owm = pyowm.OWM(apikey,language=apilanguage) | |||
fc = owm.daily_forecast(city,limit=1) | |||
f = fc.get_forecast() | |||
return_message="" | |||
for weather in f: | |||
temp = weather.get_temperature(unit='celsius') | |||
return_message += '{} : {} (min {}ºC, max {}ºC, rain:{}mm)'.format( | |||
weather.get_reference_time('date').strftime('%x'), | |||
weather.get_detailed_status(), | |||
temp['min'], | |||
temp['max'], | |||
weather.get_rain() | |||
) | |||
logging.info("Got the following weather: {}".format(return_message)) | |||
return return_message | |||
if __name__ == "__main__": | |||
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s') | |||
wtf = WeatherToFreemobile() | |||
wtf.send_sms_to_freemobile(wtf.get_weather()) |