Weather Forecast Example Script (#239)
* Example Weather forecast script Used Adafruits example as base and adapted it for python-escpos Weather icons taken from http://adamwhitcroft.com/climacons/ * Weather Icons from Adam Whitcroft Weather Icons from http://adamwhitcroft.com/climacons/ * update authors * Minor improvements * Weather Script Debugged Added one more Icon Attributed Icons in readme.md changed folder structure * Change formatting * Fixed pathing to graphics issue * fixed image size * autopep8 to clean up the code
1
AUTHORS
|
@ -15,6 +15,7 @@ ldos
|
|||
Manuel F Martinez
|
||||
Michael Billington
|
||||
Michael Elsdörfer
|
||||
mrwunderbar666
|
||||
Nathan Bookham
|
||||
Patrick Kanzler
|
||||
Qian Linfeng
|
||||
|
|
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 4.7 KiB |
|
@ -0,0 +1,10 @@
|
|||
# Climacons by Adam Whitcroft
|
||||
|
||||
75 climatically categorised pictographs for web and UI design by [@adamwhitcroft](http://www.twitter.com/#!/adamwhitcroft).
|
||||
|
||||
Visit the [Climacons](http://adamwhitcroft.com/climacons/) website for more information.
|
||||
|
||||
Visit [Adam Whitcroft on GitHub](https://github.com/AdamWhitcroft)
|
||||
|
||||
## License
|
||||
You are free to use any of the Climacons Icons (the "icons") in any personal or commercial work without obligation of payment (monetary or otherwise) or attribution, however a credit for the work would be appreciated. **Do not** redistribute or sell and **do not** claim creative credit. Intellectual property rights are not transferred with the download of the icons.
|
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 3.1 KiB |
|
@ -0,0 +1,127 @@
|
|||
#!/usr/bin/python
|
||||
|
||||
|
||||
# Adapted script from Adafruit
|
||||
# Weather forecast for Raspberry Pi w/Adafruit Mini Thermal Printer.
|
||||
# Retrieves data from DarkSky.net's API, prints current conditions and
|
||||
# forecasts for next two days.
|
||||
# Weather example using nice bitmaps.
|
||||
# Written by Adafruit Industries. MIT license.
|
||||
# Adapted and enhanced for escpos library by MrWunderbar666
|
||||
|
||||
# Icons taken from http://adamwhitcroft.com/climacons/
|
||||
# Check out his github: https://github.com/AdamWhitcroft/climacons
|
||||
|
||||
|
||||
from __future__ import print_function
|
||||
from datetime import datetime
|
||||
import calendar
|
||||
import urllib
|
||||
import json
|
||||
import time
|
||||
import os
|
||||
|
||||
from escpos.printer import Usb
|
||||
|
||||
""" Setting up the main pathing """
|
||||
this_dir, this_filename = os.path.split(__file__)
|
||||
GRAPHICS_PATH = os.path.join(this_dir, "graphics/climacons/")
|
||||
|
||||
# Adapt to your needs
|
||||
printer = Usb(0x0416, 0x5011, profile="POS-5890")
|
||||
|
||||
# You can get your API Key on www.darksky.net and register a dev account.
|
||||
# Technically you can use any other weather service, of course :)
|
||||
API_KEY = "YOUR API KEY"
|
||||
|
||||
LAT = "22.345490" # Your Location
|
||||
LONG = "114.189945" # Your Location
|
||||
|
||||
|
||||
def forecast_icon(idx):
|
||||
icon = data['daily']['data'][idx]['icon']
|
||||
image = GRAPHICS_PATH + icon + ".png"
|
||||
return image
|
||||
|
||||
|
||||
# Dumps one forecast line to the printer
|
||||
def forecast(idx):
|
||||
date = datetime.fromtimestamp(int(data['daily']['data'][idx]['time']))
|
||||
day = calendar.day_name[date.weekday()]
|
||||
lo = data['daily']['data'][idx]['temperatureMin']
|
||||
hi = data['daily']['data'][idx]['temperatureMax']
|
||||
cond = data['daily']['data'][idx]['summary']
|
||||
print(date)
|
||||
print(day)
|
||||
print(lo)
|
||||
print(hi)
|
||||
print(cond)
|
||||
time.sleep(1)
|
||||
printer.set(
|
||||
font='a',
|
||||
height=2,
|
||||
align='left',
|
||||
bold=False,
|
||||
double_height=False)
|
||||
printer.text(day + ' \n ')
|
||||
time.sleep(5) # Sleep to prevent printer buffer overflow
|
||||
printer.text('\n')
|
||||
printer.image(forecast_icon(idx))
|
||||
printer.text('low ' + str(lo))
|
||||
printer.text(deg)
|
||||
printer.text('\n')
|
||||
printer.text(' high ' + str(hi))
|
||||
printer.text(deg)
|
||||
printer.text('\n')
|
||||
# take care of pesky unicode dash
|
||||
printer.text(cond.replace(u'\u2013', '-').encode('utf-8'))
|
||||
printer.text('\n \n')
|
||||
|
||||
|
||||
def icon():
|
||||
icon = data['currently']['icon']
|
||||
image = GRAPHICS_PATH + icon + ".png"
|
||||
return image
|
||||
|
||||
|
||||
deg = ' C' # Degree symbol on thermal printer, need to find a better way to use a proper degree symbol
|
||||
|
||||
# if you want Fahrenheit change units= to 'us'
|
||||
url = "https://api.darksky.net/forecast/" + API_KEY + "/" + LAT + "," + LONG + \
|
||||
"?exclude=[alerts,minutely,hourly,flags]&units=si" # change last bit to 'us' for Fahrenheit
|
||||
response = urllib.urlopen(url)
|
||||
data = json.loads(response.read())
|
||||
|
||||
printer.print_and_feed(n=1)
|
||||
printer.control("LF")
|
||||
printer.set(font='a', height=2, align='center', bold=True, double_height=True)
|
||||
printer.text("Weather Forecast")
|
||||
printer.text("\n")
|
||||
printer.set(align='center')
|
||||
|
||||
|
||||
# Print current conditions
|
||||
printer.set(font='a', height=2, align='center', bold=True, double_height=False)
|
||||
printer.text('Current conditions: \n')
|
||||
printer.image(icon())
|
||||
printer.text("\n")
|
||||
|
||||
printer.set(font='a', height=2, align='left', bold=False, double_height=False)
|
||||
temp = data['currently']['temperature']
|
||||
cond = data['currently']['summary']
|
||||
printer.text(temp)
|
||||
printer.text(' ')
|
||||
printer.text(deg)
|
||||
printer.text(' ')
|
||||
printer.text('\n')
|
||||
printer.text('Sky: ' + cond)
|
||||
printer.text('\n')
|
||||
printer.text('\n')
|
||||
|
||||
# Print forecast
|
||||
printer.set(font='a', height=2, align='center', bold=True, double_height=False)
|
||||
printer.text('Forecast: \n')
|
||||
forecast(0)
|
||||
forecast(1)
|
||||
printer.cut
|
||||
printer.control("LF")
|