131 lines
3.7 KiB
Python
131 lines
3.7 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# 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 absolute_import
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
from __future__ import unicode_literals
|
|
|
|
import calendar
|
|
import json
|
|
import os
|
|
import time
|
|
import urllib
|
|
from datetime import datetime
|
|
|
|
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')
|