weatherclock.py 5.57 KiB
#!/usr/bin/env python
import pyowm
import time
from itertools import izip_longest as zip_longest
from datetime import datetime
from pytz import timezone
import unicornhathd as u
# WEATHER
owm = pyowm.OWM('API HERE HERE')
observation = owm.weather_at_place('Europe/Berlin')
w = observation.get_weather()
# TIME
england = timezone('Europe/Berlin')
# CREATING BINARY CLOCK MATRIX (Code for binary clock by Peter Simyoni: gist.github.com/psimonyi/2856099)
def main():
return(vertical_strings(bcd(Now)))
# bcd :: iterable(characters '0'-'9') -> [str]
def bcd(digits):
'Convert a string of decimal digits to binary-coded-decimal.'
def bcdigit(d):
'Convert a decimal digit to BCD (4 bits wide).'
# [2:] strips the '0b' prefix added by bin().
return bin(d)[2:].rjust(4, '0')
return (bcdigit(int(d)) for d in digits)
# vertical_strings :: iterable(str) -> str
def vertical_strings(strings):
'Orient an iterable of strings vertically: one string per column.'
iters = [iter(s) for s in strings]
concat = ''.join
return '\n'.join(map(concat,
zip_longest(*iters, fillvalue=' ')))
# UNICORN
u.rotation(270)
u.brightness(0.3)
# clock
def set_hours():
for i in range(4,12,2):
if int(list(reversed(Time.split()))[i/2 - 2][0]) == 1:
u.set_pixel(2,i,240,40,100)
u.set_pixel(3,i,240,40,100)
u.set_pixel(2,i+1,240,40,100)
u.set_pixel(3,i+1,240,40,100)
else:
u.set_pixel(2,i,0,0,0)
u.set_pixel(3,i,0,0,0)
u.set_pixel(2,i+1,0,0,0)
u.set_pixel(3,i+1,0,0,0)
for i in range(4,12,2):
if int(list(reversed(Time.split()))[i/2 - 2][1]) == 1:
u.set_pixel(4,i,240,40,100)
u.set_pixel(5,i,240,40,100)
u.set_pixel(4,i+1,240,40,100)
u.set_pixel(5,i+1,240,40,100)
else:
u.set_pixel(4,i,0,0,0)
u.set_pixel(5,i,0,0,0)
u.set_pixel(4,i+1,0,0,0)
u.set_pixel(5,i+1,0,0,0)
def set_mins():
for i in range(4,12,2):
if int(list(reversed(Time.split()))[i/2 - 2][2]) == 1:
u.set_pixel(6,i,40,240,130)
u.set_pixel(7,i,40,240,130)
u.set_pixel(6,i+1,40,240,130)
u.set_pixel(7,i+1,40,240,130)
else:
u.set_pixel(6,i,0,0,0)
u.set_pixel(7,i,0,0,0)
u.set_pixel(6,i+1,0,0,0)
u.set_pixel(7,i+1,0,0,0)
for i in range(4,12,2):
if int(list(reversed(Time.split()))[i/2 - 2][3]) == 1:
u.set_pixel(8,i,40,240,130)
u.set_pixel(9,i,40,240,130)
u.set_pixel(8,i+1,40,240,130)
u.set_pixel(9,i+1,40,240,130)
else:
u.set_pixel(8,i,0,0,0)
u.set_pixel(9,i,0,0,0)
u.set_pixel(8,i+1,0,0,0)
u.set_pixel(9,i+1,0,0,0)
def set_secs():
for i in range(4,12,2):
if int(list(reversed(Time.split()))[i/2 - 2][4]) == 1:
u.set_pixel(10,i,40,90,255)
u.set_pixel(11,i,40,90,255)
u.set_pixel(10,i+1,40,90,255)
u.set_pixel(11,i+1,40,90,255)
else:
u.set_pixel(10,i,0,0,0)
u.set_pixel(11,i,0,0,0)
u.set_pixel(10,i+1,0,0,0)
u.set_pixel(11,i+1,0,0,0)
for i in range(4,12,2):
if int(list(reversed(Time.split()))[i/2 - 2][5]) == 1:
u.set_pixel(12,i,40,90,255)
u.set_pixel(13,i,40,90,255)
u.set_pixel(12,i+1,40,90,255)
u.set_pixel(13,i+1,40,90,255)
else:
u.set_pixel(12,i,0,0,0)
u.set_pixel(13,i,0,0,0)
u.set_pixel(12,i+1,0,0,0)
u.set_pixel(13,i+1,0,0,0)
def set_time():
set_hours()
set_mins()
set_secs()
# border
status = w.get_status().lower()
for i in range(0,16):
if status == 'snow':
u.set_pixel(i,0,70,130,200)
u.set_pixel(0,i,70,130,200)
u.set_pixel(i,15,70,130,200)
u.set_pixel(15,i,70,130,200)
elif status == 'rain':
u.set_pixel(i,0,70,130,255)
u.set_pixel(0,i,70,130,255)
u.set_pixel(i,15,70,130,255)
u.set_pixel(15,i,70,130,255)
elif status == 'clouds':
u.set_pixel(i,0,160,160,170)
u.set_pixel(0,i,160,160,170)
u.set_pixel(i,15,160,160,170)
u.set_pixel(15,i,160,160,170)
elif status == 'sunny':
u.set_pixel(i,0,255,230,40)
u.set_pixel(0,i,255,230,40)
u.set_pixel(i,15,255,230,40)
else:
u.set_pixel(i,0,255,255,255)
u.set_pixel(0,i,255,255,255)
u.set_pixel(i,15,255,255,255)
u.set_pixel(15,i,255,255,255)
#top and bottom bars
for i in range(3,13):
u.set_pixel(i,2,255,255,255)
u.set_pixel(i,13,255,255,255)
#temperature bar
def roundTo(x, base):
return int(base * round(float(x)/base))
tempDots = roundTo(w.get_temperature('celsius')['temp'],5)/5
for i in range(0,tempDots):
u.set_pixel(i+3,2,255,185,20)
#humidity bar
humidityDots = roundTo(w.get_humidity(),10)/10
for i in range(0,humidityDots):
u.set_pixel(i+3,13,110,130,255)
count = 0
#do the things
while True:
Now = datetime.now(england).strftime('%H%M%S')
Time = main()
set_time()
count+=1
if count == 4:
w = observation.get_weather()
tempDots = roundTo(w.get_temperature('celsius')['temp'],5)/5
humidityDots = roundTo(w.get_humidity(),10)/10
for i in range(0,tempDots):
u.set_pixel(i+3,2,255,185,20)
for i in range(0,humidityDots):
u.set_pixel(i+3,13,110,130,255)
count = 0
u.show()
time.sleep(1)