PiVelib should be fully working.
This commit is contained in:
parent
a469a3611f
commit
e4f3e29035
167
pivelib.py
167
pivelib.py
@ -18,6 +18,8 @@ import xml.etree.ElementTree as ET
|
|||||||
import datetime
|
import datetime
|
||||||
import wiringpi2 as wp2
|
import wiringpi2 as wp2
|
||||||
import time as time_lib
|
import time as time_lib
|
||||||
|
import signal
|
||||||
|
import threading
|
||||||
|
|
||||||
wp2.wiringPiSetup()
|
wp2.wiringPiSetup()
|
||||||
|
|
||||||
@ -155,11 +157,13 @@ def stringLCD(string):
|
|||||||
for character in string:
|
for character in string:
|
||||||
characterLCD(character)
|
characterLCD(character)
|
||||||
|
|
||||||
|
|
||||||
# X ranges from 0 to 84
|
# X ranges from 0 to 84
|
||||||
# Y ranges from 0 to 5
|
# Y ranges from 0 to 5
|
||||||
def gotoXYLCD(x, y):
|
def gotoXYLCD(x, y):
|
||||||
writeLCD(0, 0x80 | x)
|
writeLCD(0, 0x80 | x)
|
||||||
writeLCD(0, 0x40 | y)
|
writeLCD(0, 0x40 | y)
|
||||||
|
|
||||||
|
|
||||||
def initLCD():
|
def initLCD():
|
||||||
wp2.pinMode(PIN_SCE, 1)
|
wp2.pinMode(PIN_SCE, 1)
|
||||||
@ -184,12 +188,89 @@ def clearLCD():
|
|||||||
writeLCD(LCD_D, 0x00)
|
writeLCD(LCD_D, 0x00)
|
||||||
characterLCD(' ')
|
characterLCD(' ')
|
||||||
|
|
||||||
|
|
||||||
|
def kill_handler(signum, frame):
|
||||||
|
global running
|
||||||
|
global update_thread
|
||||||
|
print("Exiting...")
|
||||||
|
running = False
|
||||||
|
update_thread.cancel()
|
||||||
|
|
||||||
|
|
||||||
|
def update():
|
||||||
|
print("Updating...")
|
||||||
|
global available
|
||||||
|
global free
|
||||||
|
global weather_now
|
||||||
|
global temp_now
|
||||||
|
global weather_3h
|
||||||
|
global temp_3h
|
||||||
|
global weather_6h
|
||||||
|
global temp_6h
|
||||||
|
global weather_9h
|
||||||
|
global temp_9h
|
||||||
|
global running
|
||||||
|
|
||||||
|
# =======================
|
||||||
|
# Requête sur l'API Vélib
|
||||||
|
# =======================
|
||||||
|
for station in stations:
|
||||||
|
r = http.request('GET', base_url+str(station))
|
||||||
|
|
||||||
|
if r.status == 200:
|
||||||
|
station_xml = ET.fromstring(r.data)
|
||||||
|
|
||||||
|
for child in station_xml.iter('available'):
|
||||||
|
available[station] = child.text
|
||||||
|
for child in station_xml.iter('free'):
|
||||||
|
free[station] = child.text
|
||||||
|
|
||||||
|
else:
|
||||||
|
available[station] = -1
|
||||||
|
free[station] = -1
|
||||||
|
|
||||||
|
# ==================================
|
||||||
|
# Requête pour les prédictions météo
|
||||||
|
# ==================================
|
||||||
|
url_weather = ('http://api.openweathermap.org/data/2.5/forecast' +
|
||||||
|
'?q=Paris,fr&mode=xml&lang=fr&units=metric')
|
||||||
|
r = http.request('GET', url_weather)
|
||||||
|
|
||||||
|
if r.status == 200:
|
||||||
|
weather_xml = ET.fromstring(r.data)
|
||||||
|
|
||||||
|
for child in weather_xml.iter('forecast'):
|
||||||
|
for time in child.iter('time'):
|
||||||
|
time_from = datetime.datetime.strptime(time.attrib['from'],
|
||||||
|
"%Y-%m-%dT%H:%M:%S")
|
||||||
|
time_to = datetime.datetime.strptime(time.attrib['to'],
|
||||||
|
"%Y-%m-%dT%H:%M:%S")
|
||||||
|
|
||||||
|
if time_to > now and time_from < now:
|
||||||
|
weather_now = time.find('clouds').attrib['value']
|
||||||
|
temp_now = time.find('temperature').attrib['value']
|
||||||
|
|
||||||
|
if (time_to > now + datetime.timedelta(hours=3) and
|
||||||
|
time_from < now+datetime.timedelta(hours=3)):
|
||||||
|
weather_3h = time.find('clouds').attrib['value']
|
||||||
|
temp_3h = time.find('temperature').attrib['value']
|
||||||
|
|
||||||
|
if (time_to > now+datetime.timedelta(hours=6) and
|
||||||
|
time_from < now+datetime.timedelta(hours=6)):
|
||||||
|
weather_6h = time.find('clouds').attrib['value']
|
||||||
|
temp_6h = time.find('temperature').attrib['value']
|
||||||
|
|
||||||
|
if (time_to > now+datetime.timedelta(hours=9) and
|
||||||
|
time_from < now+datetime.timedelta(hours=9)):
|
||||||
|
weather_9h = time.find('clouds').attrib['value']
|
||||||
|
temp_9h = time.find('temperature').attrib['value']
|
||||||
# ==========
|
# ==========
|
||||||
# Paramètres
|
# Paramètres
|
||||||
# ==========
|
# ==========
|
||||||
|
|
||||||
if(len(sys.argv) == 1):
|
if(len(sys.argv) == 1):
|
||||||
exit('Vous devez fournir au moins un numéro de station en argument.')
|
sys.exit('You must provide at least one station number as ' +
|
||||||
|
'argument on the command line.')
|
||||||
|
|
||||||
stations = []
|
stations = []
|
||||||
for station in sys.argv[1:]:
|
for station in sys.argv[1:]:
|
||||||
@ -203,9 +284,14 @@ base_url = ('http://www.velib.paris.fr/service/stationdetails/paris/')
|
|||||||
http = urllib3.PoolManager()
|
http = urllib3.PoolManager()
|
||||||
initLCD()
|
initLCD()
|
||||||
clearLCD()
|
clearLCD()
|
||||||
gotoXYLCD(0,0)
|
gotoXYLCD(0, 0)
|
||||||
stringLCD("Loading...")
|
stringLCD("Loading...")
|
||||||
|
|
||||||
|
running = True
|
||||||
|
update_thread = threading.Timer(900, update)
|
||||||
|
update_thread.start()
|
||||||
|
signal.signal(signal.SIGINT, kill_handler)
|
||||||
|
|
||||||
# ====
|
# ====
|
||||||
# Date
|
# Date
|
||||||
# ====
|
# ====
|
||||||
@ -213,32 +299,11 @@ now = datetime.datetime.now()
|
|||||||
date = now.strftime('%d/%m/%Y')
|
date = now.strftime('%d/%m/%Y')
|
||||||
time = now.strftime('%H:%M')
|
time = now.strftime('%H:%M')
|
||||||
|
|
||||||
# =======================
|
# ====
|
||||||
# Requête sur l'API Vélib
|
# Vars
|
||||||
# =======================
|
# ====
|
||||||
available = {}
|
available = {}
|
||||||
free = {}
|
free = {}
|
||||||
for station in stations:
|
|
||||||
r = http.request('GET', base_url+str(station))
|
|
||||||
|
|
||||||
if r.status == 200:
|
|
||||||
station_xml = ET.fromstring(r.data)
|
|
||||||
|
|
||||||
for child in station_xml.iter('available'):
|
|
||||||
available[station] = child.text
|
|
||||||
for child in station_xml.iter('free'):
|
|
||||||
free[station] = child.text
|
|
||||||
|
|
||||||
else:
|
|
||||||
available[station] = -1
|
|
||||||
free[station] = -1
|
|
||||||
|
|
||||||
# ==================================
|
|
||||||
# Requête pour les prédictions météo
|
|
||||||
# ==================================
|
|
||||||
url_weather = ('http://api.openweathermap.org/data/2.5/forecast' +
|
|
||||||
'?q=Paris,fr&mode=xml&lang=fr&units=metric')
|
|
||||||
r = http.request('GET', url_weather)
|
|
||||||
|
|
||||||
weather_now = ''
|
weather_now = ''
|
||||||
temp_now = -1
|
temp_now = -1
|
||||||
@ -249,40 +314,12 @@ temp_6h = -1
|
|||||||
weather_9h = ''
|
weather_9h = ''
|
||||||
temp_9h = -1
|
temp_9h = -1
|
||||||
|
|
||||||
if r.status == 200:
|
update()
|
||||||
weather_xml = ET.fromstring(r.data)
|
|
||||||
|
|
||||||
for child in weather_xml.iter('forecast'):
|
|
||||||
for time in child.iter('time'):
|
|
||||||
time_from = datetime.datetime.strptime(time.attrib['from'],
|
|
||||||
"%Y-%m-%dT%H:%M:%S")
|
|
||||||
time_to = datetime.datetime.strptime(time.attrib['to'],
|
|
||||||
"%Y-%m-%dT%H:%M:%S")
|
|
||||||
|
|
||||||
if time_to > now and time_from < now:
|
|
||||||
weather_now = time.find('clouds').attrib['value']
|
|
||||||
temp_now = time.find('temperature').attrib['value']
|
|
||||||
|
|
||||||
if (time_to > now + datetime.timedelta(hours=3) and
|
|
||||||
time_from < now+datetime.timedelta(hours=3)):
|
|
||||||
weather_3h = time.find('clouds').attrib['value']
|
|
||||||
temp_3h = time.find('temperature').attrib['value']
|
|
||||||
|
|
||||||
if (time_to > now+datetime.timedelta(hours=6) and
|
|
||||||
time_from < now+datetime.timedelta(hours=6)):
|
|
||||||
weather_6h = time.find('clouds').attrib['value']
|
|
||||||
temp_6h = time.find('temperature').attrib['value']
|
|
||||||
|
|
||||||
if (time_to > now+datetime.timedelta(hours=9) and
|
|
||||||
time_from < now+datetime.timedelta(hours=9)):
|
|
||||||
weather_9h = time.find('clouds').attrib['value']
|
|
||||||
temp_9h = time.find('temperature').attrib['value']
|
|
||||||
|
|
||||||
|
|
||||||
# ============================
|
# ============================
|
||||||
# Afficher les infos à l'écran
|
# Afficher les infos à l'écran
|
||||||
# ============================
|
# ============================
|
||||||
running = True
|
|
||||||
while running:
|
while running:
|
||||||
for station in stations:
|
for station in stations:
|
||||||
clearLCD()
|
clearLCD()
|
||||||
@ -296,6 +333,8 @@ while running:
|
|||||||
stringLCD("Free: "+str(free[station]))
|
stringLCD("Free: "+str(free[station]))
|
||||||
time_lib.sleep(2)
|
time_lib.sleep(2)
|
||||||
|
|
||||||
|
if running is False:
|
||||||
|
continue
|
||||||
clearLCD()
|
clearLCD()
|
||||||
gotoXYLCD(0, 0)
|
gotoXYLCD(0, 0)
|
||||||
stringLCD("[Weather]")
|
stringLCD("[Weather]")
|
||||||
@ -304,9 +343,11 @@ while running:
|
|||||||
gotoXYLCD(0, 2)
|
gotoXYLCD(0, 2)
|
||||||
stringLCD(weather_now.capitalize())
|
stringLCD(weather_now.capitalize())
|
||||||
gotoXYLCD(0, 4)
|
gotoXYLCD(0, 4)
|
||||||
stringLCD(str(temp_now)+"C")
|
stringLCD("Temp:"+str(temp_now)+"C")
|
||||||
time_lib.sleep(2)
|
time_lib.sleep(2)
|
||||||
|
|
||||||
|
if running is False:
|
||||||
|
continue
|
||||||
clearLCD()
|
clearLCD()
|
||||||
gotoXYLCD(0, 0)
|
gotoXYLCD(0, 0)
|
||||||
stringLCD("[Weather]")
|
stringLCD("[Weather]")
|
||||||
@ -315,9 +356,11 @@ while running:
|
|||||||
gotoXYLCD(0, 2)
|
gotoXYLCD(0, 2)
|
||||||
stringLCD(weather_3h.capitalize())
|
stringLCD(weather_3h.capitalize())
|
||||||
gotoXYLCD(0, 4)
|
gotoXYLCD(0, 4)
|
||||||
stringLCD(str(temp_3h)+"C")
|
stringLCD("Temp:"+str(temp_3h)+"C")
|
||||||
time_lib.sleep(2)
|
time_lib.sleep(2)
|
||||||
|
|
||||||
|
if running is False:
|
||||||
|
continue
|
||||||
clearLCD()
|
clearLCD()
|
||||||
gotoXYLCD(0, 0)
|
gotoXYLCD(0, 0)
|
||||||
stringLCD("[Weather]")
|
stringLCD("[Weather]")
|
||||||
@ -326,9 +369,11 @@ while running:
|
|||||||
gotoXYLCD(0, 2)
|
gotoXYLCD(0, 2)
|
||||||
stringLCD(weather_6h.capitalize())
|
stringLCD(weather_6h.capitalize())
|
||||||
gotoXYLCD(0, 4)
|
gotoXYLCD(0, 4)
|
||||||
stringLCD(str(temp_6h)+"C")
|
stringLCD("Temp:"+str(temp_6h)+"C")
|
||||||
time_lib.sleep(2)
|
time_lib.sleep(2)
|
||||||
|
|
||||||
|
if running is False:
|
||||||
|
continue
|
||||||
clearLCD()
|
clearLCD()
|
||||||
gotoXYLCD(0, 0)
|
gotoXYLCD(0, 0)
|
||||||
stringLCD("[Weather]")
|
stringLCD("[Weather]")
|
||||||
@ -337,7 +382,7 @@ while running:
|
|||||||
gotoXYLCD(0, 2)
|
gotoXYLCD(0, 2)
|
||||||
stringLCD(weather_9h.capitalize())
|
stringLCD(weather_9h.capitalize())
|
||||||
gotoXYLCD(0, 4)
|
gotoXYLCD(0, 4)
|
||||||
stringLCD(str(temp_9h)+"C")
|
stringLCD("Temp:"+str(temp_9h)+"C")
|
||||||
time_lib.sleep(2)
|
time_lib.sleep(2)
|
||||||
|
|
||||||
clearLCD()
|
clearLCD()
|
||||||
|
Loading…
Reference in New Issue
Block a user